java synchronized

同步类型

1 同步代码块

synchronized(obj)

{

}

obj是一个对象的实例

一个线程A执行这个代码块时,其他线程(B,C,D)遇到被obj同步的代码块就阻塞,等待A解除占用后再执行,A可以在同步代码块中调用被obj同步的其他代码块内容。

2 同步函数

public synchronized void action()

{

}

方法同步时,同步锁对象是调用这个方法的对象

3 同步静态函数

4 同步类

Class Foo 
{
 public synchronized static void methodA()
 {
 }
 public void methodBBB()
 {
    synchronized(Foo.class)   //  class literal(类名称字面常量)
 }
}

代码中的methodBBB()方法是把class literal作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。

特殊注意

1 无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象

2 每个对象只有一个锁与之相关联。

3 实现同步要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。

4 但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁:

class Foo implements Runnable

{
   private byte[] lock = new byte[0];  // 特殊的instance变量
   Public void methodA()
   {
     synchronized(lock) {
     }
   }
}

注:零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码。

原文地址:https://www.cnblogs.com/nafio/p/9137729.html