synchronized
被他润饰的办法或代码块在任一时刻只有一个线程执行。
应用synchronized
润饰实例办法=对实例加锁,执行前须要取得实例的锁
synchronized void method() { //业务代码}
润饰静态方法 = 对类加锁
synchronized static void method() {//业务代码}
润饰代码块 = 给指定对象/类加锁
synchronized(this) { //业务代码}synchronized(类.class){ //blabla}
双重校验锁实现单例模式 线程平安
public class Singleton{ private volatile static Singleton uniqueInstance; private Singleton(){ } public static Singleton getInstance(){ //先判断对象是否曾经实例过 if (uniqueInstance == null){ synchronized (Singleton.class){ if (uniqueInstance == null){ uniqueInstance = new Singleton(); } } } }}
下面代码为什么要用volatile
uniqueInstance = new Singleton();的步骤
1.给uni调配内存地址
2.初始化uni
3.把uni指向方才调配的内存地址
因为jvm指令重排,上述步骤可能依照1 3 2的程序执行,多线程环境下,执行完3就有调用方get到了uni,然而此时uni还没有被初始化。
volatile能够防止指令重排。
构造方法自身就是线程平安的
不须要用synchronized润饰。