快速理解synchronized的主要用法

synchronized的主要用法

synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:

  1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
  2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
  3. 修饰一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象
  4. 修饰一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。

修饰一个方法或者代码块

两种写法等价,都是锁定了整个方法时的内容。

写法一:

public synchronized void method() {
// todo
}

写法二:

public void method() {
     synchronized(this) {
 // todo
     }
}

当有一个明确的对象作为锁时,就可以用类似下面这样的方式写程序。

public void method3(SomeObject obj) {
//obj 锁定的对象
    synchronized(obj) {
// todo
    }
}

当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的对象来充当锁:

class Test implements Runnable {
        private byte[] lock = new byte[0]; // 特殊的instance变量
        public void method() {
            synchronized(lock) {
// todo 同步代码块
            }
        }
		public void run() {

    }
}

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

修饰一个静态方法或者修饰一个类

修饰静态方法

 public synchronized static void method() {
 // todo
 }

修饰类

 class Class1 {
         public void method() {
             synchronized(Class1.class) {
 // todo
             }
         }
 }

你可能感兴趣的:(快速理解synchronized的主要用法)