synchronized关键字的作用(一)

synchronized的作用(一)

synchronized的作用
一、同步方法
public synchronized void methodAAA(){

//….

}
锁定的是调用这个同步方法的对象

测试:
a、不使用这个关键字修饰方法,两个线程调用同一个对象的这个方法。
目标类:

Java代码
  1. public class TestThread {   
  2.     public  void execute(){  //synchronized,未修饰   
  3.         for(int i=0;i<100;i++){   
  4.               System.out.println(i);   
  5.           }       
  6.       }   
  7. }  


线程类:

Java代码
  1. public class ThreadA implements Runnable{   
  2.       TestThread test=null;   
  3.     public ThreadA(TestThread pTest){  //对象有外部引入,这样保证是同一个对象   
  4.           test=pTest;   
  5.       }   
  6.     public void run() {   
  7.           test.execute();   
  8.       }   
  9. }  

调用:
Java代码
  1. TestThread test=new TestThread();   
  2. Runnable runabble=new ThreadA(test);   
  3. Thread a=new Thread(runabble,"A");                   
  4. a.start();   
  5. Thread b=new Thread(runabble,"B");   
  6. b.start();  


结果:
输出的数字交错在一起。说明不是同步的,两个方法在不同的线程中是异步调用的。

b、修改目标类,增加synchronized修饰

Java代码
  1. public class TestThread {   
  2.     public synchronized  void execute(){  //synchronized修饰   
  3.         for(int i=0;i<100;i++){   
  4.               System.out.println(i);   
  5.           }       
  6.       }   
  7. }  


结果:
输出的数字是有序的,首先输出A的数字,然后是B,说明是同步的,虽然是不同的线程,但两个方法是同步调用的。
注意:上面虽然是两个不同的线程,但是是同一个实例对象。下面使用不同的实例对象进行测试。

c、每个线程都有独立的TestThread对象。
目标类:

Java代码
  1. public class TestThread {   
  2.     public synchronized void execute(){  //synchronized修饰   
  3.         for(int i=0;i<100;i++){   
  4.               System.out.println(i);   
  5.           }       
  6.       }   
  7. }  

线程类:
Java代码
  1. public class ThreadA implements Runnable{   
  2.     public void run() {   
  3.           TestThread test=new TestThread();   
  4.           test.execute();   
  5.       }   
  6. }  


调用:
Java代码
  1. Runnable runabble=new ThreadA();   
  2. Thread a=new Thread(runabble,"A");                   
  3. a.start();   
  4. Thread b=new Thread(runabble,"B");   
  5. b.start();  


结果:
输出的数字交错在一起。说明虽然增加了synchronized 关键字来修饰方法,但是不同的线程调用各自的对象实例,两个方法仍然是异步的。
posted @ 2008-07-02 16:13  supers  阅读(450)  评论(0)    收藏  举报