volatile和synchronized

如何把非原子性操作变成原子性操作?
1、volatile关键字只能保证可见性,并不保证原子性
2、synchronized关键字,使操作具有原子性

区分一下synchronize内置锁和互斥锁
1、内置锁,在对象头,自动获取释放,获得的唯一方式,进入锁保护的同步代码块
2、互斥锁,内置锁就是一个互斥锁,当有多个线程获取锁时,只有一个能获取成功,其他线程阻塞等待。

synchronized修饰范围
1、修饰普通方法,锁实例
2、修饰静态方法,锁类,一般不要在静态方法上用synchronized,会造成阻塞。
3、修饰代码块,锁住一个对象lock,synchronized(lock)

volatile关键字只能修饰变量

volatile的作用,阻止指令重排序

volatile使用场景
1、修饰作为判断条件的变量
2、懒汉式单例模式,在双重检测锁的判断之后,依然有风险,就是在创建实例的时候,可能会发生指令重排序,所以对象的变量在定义的时候使用volatile防止重排序。

你可能感兴趣的:(java,并发)