乐观锁:假定没有冲突,在修改数据时如果发现数据和之前获取的不一致,则读最新数据,修改后,重试修改。
悲观锁:假定会发生并发冲突,同步所有对数据的相关操作,从读数据就开始上锁
可重入锁:线程拿到一把锁之后,可以自由进入同一把锁所同步的其他代码。
不可重入锁:那就是与可重入锁相反。线程拿到一把锁之后,不可以自由进入同一把锁所同步的其他代码。
公平锁:争抢锁的顺序,如果是按先来后到,则为公平
非公平锁:争抢锁的顺序,如果不是按先来后到,则为不公平
锁消除:JIT编译器会把stringbuffer的append方法进行锁消除,因为append方法源码是加synchronized关键字的。那么不停的append会造成性能问题。所以JIT编译的时候会对这一部分单线程进行的时候进行锁消除。把synchronized语义消除掉。这就是锁消除
锁粗化:运行时 JIT 编译优化
public class Test1 { int count; public void print() { for (int i = 0; i < 1000000; i++) { synchronized (this){ System.out.println(count++); } } } public static void main(String[] args) { Test1 t = new Test1(); t.print(); } }
上面这段代码经过锁粗化后会变成这样:
public class Test1 { int count; public void print() { synchronized (this) { for (int i = 0; i < 1000000; i++) { System.out.println(count++); } } } public static void main(String[] args) { Test1 t = new Test1(); t.print(); } }
sync是锁对象,那么对象头里保存了信息的。
未锁定的状态就是第一行 hashcode 01(Tag)
既然是未锁定,现在两个线程如果遇到sync关键字那就是要抢锁了,抢锁的话就是要改变Tag的值。
先看轻量级锁,现在线程要去抢轻量级锁,要改变Tag的值,怎么改变?用CAS操作
CAS的缺点:一次只能修改一个值,自旋消耗CPU资源,ABA问题。
自旋有一定的次数限制,超过次数限制后。就会升级锁,--> 重量级锁。
重量级锁
重量级锁会有 Monitor ,Java当中每一个对象都会有一个Monitor
当轻量级锁到重量级锁升级的过程中Tag状态位的修改 就不是CAS修改的了。是JVM实现的。
原来锁的信息是记录在Java对象的对象头中,而升级了重量级锁后,这个信息就记录在Monitor中了。
Monitor中有 owner字段,就是标记了谁获取了锁。引出Monitor是为了不让其他线程进行自旋抢锁了。那怎么抢锁呢?就会有一个EntryList,一个集合。里面存的是等待的线程。EntryList里面的线程就挂起,不再自旋抢锁。
对象调用wait()方法后,owner 就 == null 然后进入 WaitSet 集合。因为wait是释放锁的,所以释放了之后,EntryList中的线程就可以去抢锁
如果对象调用了 notify方法的话,那么WaitSet 中的线程会出来抢锁,或者进入EntryList。
如果代码sync代码执行完毕,那么对象就会释放锁也释放。那么和wait的区别就在于 wait之后是进入了WaitSet,而退出后,就正儿八经的退出了,不再持有Monitor了。
如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!
怎么获取线程的执行结果
使用CountDownLatch获取线程执行结果
Lock接口在 java.util.concurrent.Locks包下。
1.7的hashmap 的数据结构是 数组+链表。 保存数据的是 transient Entry[] table = (Entry[]) EMPTY_TABLE; 什么时候扩容? 假如阈值为5 , 当第5个元素put进来的时候,且第5个元素的index所在的位置有元素的时候才扩容。 (假如有4个元素,都存储在index = 0的位置上,第5个进来的时候也存在index = 0的话,也是要扩容的) 扩容是之前容量的2倍。
温故而知新:Map是什么?
温故而知新:什么是死锁?
浏览器内核即浏览器底层最核心和最基础的那一部分,它主要负责对网页当中的html、css、JavaScript进行解释然后在浏览器当中进行渲染最终呈现给用户,也就是说内核的工作就是渲染,所以我们常常把浏览器内核称为渲染引擎(Rendering Engine)也称为布局引擎(Layout Engine)、排版引擎。 另外,由于不同浏览器的渲染内核不同,对 html、css、 JavaScript的语法解释也存在差异(兼容问题),因此我们在开发过程中需要在不同内核的浏览器当中进行网页渲染效果的测试。
openGauss 多线程架构启动过程详解
我们来认识认识最完整的文件操作
prtyaa 收益393.62元
zlj141319 收益217.55元
1843880570 收益214.2元
IT-feng 收益208.98元
风晓 收益208.24元
777 收益172.71元
Fhawking 收益106.6元
信创来了 收益105.84元
克里斯蒂亚诺诺 收益91.08元
技术-小陈 收益79.5元
扫一扫关注公众号
扫一扫加入交流群
加入交流群
请使用微信扫一扫!