Java之多线程和并发
2020-02-10 本文已影响0人
zhglance
1.volatile变量
1.1 可见性
volatile修饰符保证volatile变量对所有线程可见,当一个线程修改了volatile变量值之后,其他线程可以立即可见。
主要原理:
a.修改volatile变量,会强制将修改后的值刷新到系统主内存中;
b.修改volatile变量,会导致其他线程工作内存中对应的volatile变量值失效。其他线程再读取该volatile变量值的时候,需要重新从读取主内存中的volatile值。
1.2 有序性
volatile变量的有序性,禁止了JVM的重新排序优化,即线程内表现为串行语义。这一点可普通变量不同,普通变量可能因为因为JVM执行的优化,变量的赋值操作可能和程序中的执行顺序不一致。
1.3 非原子性
volatile变量提供了可见性和有序性,但是并不保证原子性。
2.sleep和 wait 方法区别
相同:两者都可以暂停线程;
不同之处:sleep()没有释放锁,线程会自动苏醒,而 wait()释放了锁,线程不会自动苏醒,需要别的线程调用同一个对象上的 notify() 或者 notifyAll() 方法,通常用于线程间交互/通信 。