volatile和ThreadLocal的理解

1、ThreadLocal是用于解决多线程共享类的成员变量,原理:在每个线程中都存有一个本地ThreadMap,相当于存了一个对象的副本,key为threadlocal对象本身,value为需要存储的对象值,这样各个线程之间对于某个成员变量都有自己的副本,不会冲突。

例如:SimpleDateFormat不是线程安全的类,作为成员变量的时候会面临线程安全问题,这个时候我们需要为每一个线程本地保存一个该对象的副本。

http://blog.csdn.net/u012706811/article/details/53231598


2、volatile保证了成员变量在多线程下的可见性和有序性,不保证原子性,java中原子性的操作为读取一个值或者给一个变量赋值(例如 i=2)


3、线程在执行完一行代码,例如修改了一个变量的值,因为工作内存速度小于主存中高速CPU的速度,所以对于其他的线程而言,读取到该变量的值可能不是最新的值。

 
 

4、使用volatile关键字的时候,该变量一旦被修改,会立即写入到主存中,同时会让其他线程的工作内存中的缓存失效,这样,其他线程在访问该变量的时候会重新从主存中读取可以获得该变量最新的数据,从而保证的变量的可见性。


5、i++,i=x;这种都不属于原子性的操作,i++有三个步骤,先读取内存中i的值,然后执行i+1操作,然后把结果写回i,这样的操作不属于原子性的。


6、java内存模型(JMM)


猜你喜欢

转载自blog.csdn.net/qq_31489805/article/details/78456048