线程安全
在java的内存模型中每一个线程运行时都有一个线程栈,线程栈保存了线程运行时候变量值信息。当线程访问某个对象值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本,之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副本变量的值,在修改完之后的某一个时刻(线程退出之前),自动把线程变量副本的值回写到对象在堆中变量。这样在堆中的对象的值就产生变化了。
如堆内存中有一变量,同时有多个线程可能会修改该变量,如不加锁控制,则多个线程并发时,多个线程在修改该变量值时,先去读取堆内存变量值,保存到本地,修改后在回填,就出现了类似于git冲突一样的问题。这就是线程安全问题。