final的内存语意是什么呢?
可以保证构造方法初始化完之后在继续往下进行
也是防止重排序,java的内存模型
锁的内存语意?
当线程释放锁的时候,JVM会把该线程对应的本地内存中的共享变量刷新到主内存中
当线程获取锁的时候,JVM会把该线程的本地内存置为无效,必须从主内存读取共享变量
当在打印的时候println,为什么能够读到共享变量,这个println底层也是使用的synchronized关键字
synchronized,可以使变量可见
synchronized的实现原理
使用monitorenter和monitorexit来实现的
锁的四种状态:
无状态锁,偏向锁,轻量级锁,重量级锁
自旋锁,cas操作,挂起会导致上下文一直切换,耗时。cas使线程等一等。
偏向锁,无竞争时,不需要进行cas操作。总是使同一个线程获得。
线程头里面有一个标致位,1,当存在线程竞争的情况下,1->0,变成轻量级锁。
当锁竞争失败的情况下, 线程阻塞,0->10.变成重量级别锁。
jdk对锁有哪些优化措施?
逃逸分析,锁消除,锁粗化
锁消除:在识别到没有用锁的情况下,自己干掉锁。自动
锁粗化:锁之间的合并。自动