java之synchronized

来源:互联网 发布:未备案域名 如何跳转 编辑:程序博客网 时间:2024/06/08 02:45
1 java中有一个会控制线程的功能,就是synchronized。通过synchronized可以控制多个线程,保证每时每刻只有一个线程得到资源。
如:synchronized(this.getClass().getName()){
for(int i=0;i<10;i++){
num=num+1;
Date date=new Date();
for(int j=0;j<1000000000;j++){

}
System.out.println("name:"+name+",num:"+num+",time:"+date.getTime());
}

}


2 两个以及两个以上的线程,想通过访问一个资源。通过synchronized(当前类的全路径)方法块,通过当前类的全路径,就会始终保证是每时每刻只有一个线程得到资源。所以必须保证是当前类的全路径。通过this.getClass().getName()就可以得到当前类的全路径。
如:synchronized(this.getClass().getName()){
。。。。。。。。

}


3 所以以后想要控制每时每刻只有一个线程得到资源,而不会出现混乱。则通过synchronized即可。参数为当前类的全路径。


完整的例子:
线程1:
public class Thread_test1 extends Thread{
public void run() {
String name=Thread.currentThread().getName();
CommonService commonService=new CommonService();
commonService.test(name);
}
}
线程2:
public class Thread_test2 extends Thread{


public void run() {
String name=Thread.currentThread().getName();
CommonService commonService=new CommonService();
commonService.test(name);
}
}
资源:
public class CommonService {


private static int num=0;
public void test(String name) {
synchronized(this.getClass().getName()){

String name_=this.getClass().getName();
Class class_=com.test_thread.service.CommonService.class;
String class_name=class_.getName();
System.out.println(name_+"-"+class_name);
for(int i=0;i<10;i++){
num=num+1;
Date date=new Date();
for(int j=0;j<1000000000;j++){
}
System.out.println("name:"+name+",num:"+num+",time:"+date.getTime());
}
}
}
}
测试类:
public class TestMain {


public static void main(String[] args) {
Thread_test1 test1=new Thread_test1();
Thread_test2 test2=new Thread_test2();
test1.start();
test2.start();
}
}
原创粉丝点击