volatile i++为何不安全
自增操作是三个原子操作组合而成的复合操作。在一个操作中,读取了inc变量后,是不会再读取的inc的
,所以它的值还是之前读的旧值,它的下一步是自增操作。
Java中实现线程通信方式有哪些?
- 对象的 wait(long timeout)、wait(long timeout, int nanos)、wait() 方法,组合对象的 notify()、notifyAll()
- 显示锁:Lock.newCondition()、Condition await 系列方法、Condition signal()、signalAll()
- 信号量:Semaphore acquire 系列方法、release()系列方法
volatile关键字能否保证线程安全?
单纯使用 volatile 关键字是不能保证线程安全的
volatile 只提供了一种弱的同步机制,用来确保将变量的更新操作通知到其他线程
volatile 语义是禁用 CPU 缓存,直接从主内存读、写变量。表现为:更新 volatile 变量时,JMM 会把线程对应的本地内存中的共享变量值刷新到主内存中;读 volatile 变量时,JMM 会把线程对应的本地内存设置为无效,直接从主内存中读取共享变量
当把变量声明为 volatile 类型后,JVM 增加内存屏障,禁止 CPU 进行指令重排