一、原子性
1)什么是原子性?
通俗的来说,原子性就是指一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。
2)如何把非原子性操作变成原子性操作?
- volatile关键字仅仅保证可见性,并不保证原子性
- synchronize关键字,使得操作具有原子性
二、synchronize关键字使用场景
1)修饰普通方法:锁住对象实例
如:public synchronized void out1(){}
2)修饰静态方法:锁住整个类
如:public static synchronized void out2(){}
3)修饰代码块:锁住一个对象,synchronized (lock) 即synchronized后面括号里的内容
如:public void out3(){
synchronized(对象){
}
}
三、volatile关键字及其使用场景
1)解释:能且仅能修饰变量, 保证该变量的可见性,volatile关键字仅仅保证可见性,并不保证原子性
举例来说:A、B两个线程同时读取volatile关键字修饰的对象A读取之后,修改了变量的值,对B线程来说,修改后的值是可见
2)使用场景
1:作为线程开关
2:单例,修饰对象实例,禁止指令重排序