-
不同线程之间无法访问各自的变量,需要通过主内存进行交互查看全部
-
两条规定,线程对共享变量操作只能在工作内存中进行查看全部
-
线程和自己的工作内存交互,主内存和工作内存之间也有交互关系查看全部
-
线程有自己的工作内存,所有变量存储在主内存中,线程中保存主内存变量的副本查看全部
-
JMM,java 底层细节知识查看全部
-
多个线程中有共享变量的副本查看全部
-
共享变量查看全部
-
Java内存模型图查看全部
-
volatile通过内存屏障和禁止指令重排序实现可见性查看全部
-
可见性:一个线程对共享变量的修改, 能及时的呗其他线程看到 共享变量:如果一个变量 在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量。 java内存模型:Java Memory Model描述了java程序中各种变量(线程共享变量)的访问规则,以及在jvm中将变量存储到内存和从内存中读取出这样的底层细节。 所有变量都存储在主内存中。 每个线程都有自己独立的工作内存, 里面保存该线程使用到的变量的副本。 两条规则: 1)线程对共享变量的所有操作都必须在自己的工作内存中进行,而不能直接从主内存中读写。 2)不同线程之间无法直接访问其他线程工作内存中的变量,线程间变量值得传递需要通过主内存完成。 导致共享变量在线程间不可见的原因: 1. 线程的交叉执行-》原子性 2. 重排序结合线程交叉执行-》原子性 3. 共享变量更新后的值没有在工作内存与主内存间及时更新-》可见性 可见性实现: 1、synchronized,实现原子性,可见性。 线程解锁前,必须把共享变量的最新刷新到主内存中 线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新读取最新的值。 可以保证可见性。 2、volatile 1)能够保证volatile变量的可见性 2)不能保证volatile变量符合操作的原子性。Number++(从内存取number,number++,保存到内存三个步骤) 深入来说:通过加入内存屏障和禁止重排序优化来实现的。 1)对volatile变量执行写操作时,会在写操作后加入一条store屏障指令。 2)对volatile变量执行读操作时,会在读操作前加入一条load屏障指令。 Volatile如何实现内存可见性:通俗讲,volatile变量在每次被线程访问时,都强迫从主内存中重读该变量的值,而该变量发生变化时,又会强迫线程将最新的值刷新到主内存。 Synchronized 和 volatile 比较: 1) volatile不需要加锁,比synchronized更轻量级,不会阻塞线程; 2) 从内存可见性角度,volatile读相当于加锁,写相当于解锁。 3) Synchronized即能保证可见性,又能保证原子性,而volatile只能保证可见性,无法保证原子性。查看全部
-
多线程中 long和double java内存模型有可能分解为2个32位数字 这样就又可能出现读取半个变量的问题 但是目前大多数商用平台都已经自动对64位数据类型做了原子性操作 不用处理 保险起见可以加上volatile查看全部
-
synchronized与volatile的比较。volatile效率高,但不能保证锁内部代码块的原子性,,,查看全部
-
volatile的使用场景。1.volatile下次值不能与当前值有依赖关系,比如不能有num 或 number=number*1 2.不能与其他的volatile变量有固定表达式的关系,比如volatile1>volatile2查看全部
-
ReentrantLock实现共享变量操作原子性与内存可见性的方法,首先 Lock lock =new Reentrantlock() 然后在需要保证原子性操作的方法前调用lock.Lock() 使用try.catch.finally,在try块中放入方法,在finally中调用解锁方法lock.unlock()查看全部
-
保证number 操作原子性的三种方式查看全部
举报
0/150
提交
取消