为什么存在线程不安全?
由于
java内存模型:
所有的变量都储存在主内存之中。(局部变量是一个reference类型,其是线程私有,它引用的对象是在主内存中的,被各个线程共享的//自己的思考:如果这个对象的引用,仅有此处有,也就相当于此对象线程私有,因为对对象的访问只能通过引用啊。)
线程只能对工作内存操作,并不能直接对主内存操作(线程的工作内存中保存了被该线程使用变量的主内存的拷贝(拷贝的是基本类型和引用)),可能两个线程一起干事(A:a=a+100,
B:a=a-50),但是由于是并发执行,所以存在问题。各自拷贝的是最初的值,各自计算,最后将工作内存的值更新到主内存中,存在其中一个更新覆盖了另外一个更新。所有A和B所干的事需要保证原子性,就是保证每一次操作的值都是最新的值。volatile变量的作用在于保证可见性(即,对变量的修改可以立即被其他线程得知,实现的原理是:通过获得JIT的反汇编代码(随着高性能虚拟机真正的实现细节与虚拟机规范差距越来越大,虚拟机规范越来越成为了概念模型,分析虚拟机执行语义的行为(虚拟机做了什么),可以在字节码上分析,分析程序的执行行为(虚拟机是怎么样做的,性能如何,所以我们需要JIT反汇编))可以得知volaile是通过在变量修改之后添加lock 指令,查看ia32手册,是将cpu cache写入内存,也会让其他cpu的cache的该变量无效化,因此,所以其他线程需要重新读取该变量,保证该变量最新,还能保证一定的有序性),但是由于只是保证线程内存中的值是最新值,所有还是不能保存a=a+10也是原子的。因为该变量会拷贝到操作数栈进行操作,所以必须用sychronized将a=a+100框起来,保证这个过程不被其他线程打断。
java线程安全
最新推荐文章于 2023-06-14 11:46:03 发布