volatile和synchronized区别
volatile
1.volatile 在多线程中的一个线程改变公共变量时会通知其他的线程去主内存内读取,而不是在私有内存读取(可见性)
2.同时volatile 只针对变量级使用,所以不会造成线程阻塞
3.使用volatile而不是synchronized的唯一安全情况是类中只有一个可变的域,当一个域的值依赖于它之前的值时,volatile就无法工作了,如n=n+1,n++等;
4.volatile标记的变量不会被编译器优化
synchronized
1.synchronized锁住对象,等待一个方法执行完才会去执行下一个方法(原子性)
2.但是当多个线程去抢一个对象时会出现线程阻塞
3.synchronized能对变量、方法和类进行使用(可见性和原子性)
4.synchronized标记的变量可以被编译器优化