1 public class Test{
2
3 public void method0(){//...} //普通函数
4
5 public synchronized void method1(){//...} //同步函数
6
7 public void method2() {
8   synchronized (this){//...} //以当前对象为锁的 同步代码块
9 }
10
11 public void method3(SomeObject so) {
12   synchronized(so) {//...} //以某对象为锁的同步代码块
13 }
14
15 public void method4() {
16   //...
17   private byte[] lock = new byte[0]; // 特别的instance变量
18   synchronized (lock){//...} // 同步代码块
19   //...
20 }
21
22 public synchronized static void method5(){...} //静态同步函数
23
24 public void method6(){
25 synchronized(Test.class){...}// class literal作为同步锁的同步代码块
26 }
27
28 }

一、method1同步函数和method2中同步块synchronized (this){...}所取得的同步锁都是类Test的实例对象,即对象锁,所以method1和method2效果等同。

二、当多个并发线程访问"同一个"对象中的同步函数或同步块时,取得对象锁的线程得到执行,该线程执行期间,其他要访问该对象同步函数或同步块(不管是不是相同的同步函数或同步块)的线程将会阻塞,直到获取该对象锁后才能执行,当然要访问该对象的非同步方法或同步块的线程不受对象锁的限制,可以直接访问。

三、method2同步块synchronized (this){...}中this是指调用这个方法的对象,如果两个线程中分别调用的是t1和t2(类Test的实例化)两个对象,则这个同步块对于这两个线程来说无效,这时可以使用method3中同步块synchronized(so) {...}方式,将锁挂在其他对象上面。

四、如果要对函数中的部分代码进行同步处理,怎么办?method4中通过一个特别的实例变量充当锁来实现。

五、method5静态同步函数和method6中同步块synchronized(Test.class){...}所取得的同步锁是类锁,即类Test的锁,而非类Test的对象锁。

六、因为类锁跟对象锁是不同的锁,所以在多线程并发环境下method1和method5不构成同步。

posted on 2012-03-21 15:24  Nicholas_F  阅读(391)  评论(0编辑  收藏  举报