Synchronized

Synchronized的作用主要

(1)确保线程互斥的访问同步代码
(2)保证共享变量的修改能够及时可见
(3)有效解决重排序问题。

Synchronized的基本使用

  1. 修饰普通方法
    当synchronized关键字修饰一个方法的时候,该方法叫做同步方法。Java中的每个对象都有一个锁(lock),或者叫做监视器(monitor),当一个线程访问某个对象的synchronized方法时,将该对象上锁,其他任何线程都无法再去访问该对象的synchronized方法了(这里是指所有的同步方法,而不仅仅是同一个方法),直到之前的那个线程执行方法完毕后(或者是抛出了异常),才将该对象的锁释放掉,其他线程才有可能再去访问该对象的synchronized方法
  2. 修饰静态方法
    如果某个synchronized方法是static的,那么当线程访问该方法时,它锁的并不是synchronized方法所在的对象,而是synchronized方法所在的类所对应的Class对象。Java中,无论一个类有多少个对象,这些对象会对应唯一一个Class对象,因此当线程分别访问同一个类的两个对象的两个static,synchronized方法时,它们的执行顺序也是顺序的,也就是说一个线程先去执行方法,执行完毕后另一个线程才开始。
  3. 修饰代码块
    synchronized方法是一种粗粒度的并发控制,某一时刻,只能有一个线程执行该synchronized方法;synchronized块则是一种细粒度的并发控制,只会将块中的代码同步,位于方法内、synchronized块之外的其他代码是可以被多个线程同时访问到的

Synchronized 原理

package thread.pool;

public class SynchronizedDemo {
    public void method() {
        synchronized (this) {
            System.out.println("Method 1 start");
        }
    }
}
代码块

结果:
代码块加锁就是在方法中定义monitor对象,通过对monitor值判断来得出是否具有操作权限。

package thread.pool;

public class SynchronizedDemo {
    public synchronized void method() {
         System.out.println("Method 1 start");
    }
}
普通方法

结果:
在常量池中加入ACC_SYNCHRONIZED标示符,判断标识符是否存在来得出是否具有操作权限。

你可能感兴趣的:(Synchronized)