作者回复: 赞
作者回复: 在获取到参与锁资源竞争的线程会进入entrylist,线程monitorenter失败后会进入到waitset,此时说明已经有线程获取到锁了,所以需要进入等待。调用wait方法也会进入到waitset。
作者回复: JDK1.8之后ConcurrentHashMap就放弃了分段锁策略,而是直接使用CAS+Synchronized方式保证性能,这里的锁是指锁table的首个Node节点。在添加数据的时候,如果Node数组没有值的情况,则会使用CAS添加数据,CAS成功则添加成功,失败则进入锁代码块执行插入链表或红黑树或转红黑树操作。
作者回复: 锁状态只能升级不能降级。
作者回复: 老师没有看懂你问的具体问题,麻烦再描述一下你的问题。
作者回复: 如果哪里不懂的,可以多提问,希望我能帮助到你。
作者回复: 这里老师纠正下,当竞争Monitor失败后,是去到ContentionList队列,而运行中的线程调用了wait方法会进入到WaitSet队列,等调用notify方法,会去队列中唤醒相应的线程,进入到EntryList队列中。文中已更新。
作者回复: 主要区别是获取锁的方式,如果没有自旋,轻量级锁是通过cas来获取锁的,cas失败则直接升级为重量级锁。
作者回复: 不是的,一旦锁消除了,就不会再使用该锁了。逃逸分析一般是对一个对象的作用域的分析,例如一个对象只能被一个线程访问到时,则会消除锁。
作者回复: 减少锁占用时间和减小锁粒度是最直观的减少锁竞争的方式了
作者回复: 对的,普通方法中的锁时锁对象,而修饰静态方法是类锁
作者回复: 是的,感谢黑崽同学的提醒。