
java
克罗地亚狂想曲
Human is great,because they can use fire
展开
-
java多线程系列-----死锁以及解决死锁的办法
死锁的四个必要条件1)互斥条件,即某个资源在一段时间内只能由一个线程占有,不能同时被两个或两个以上的线程占有2)不可抢占条件,线程所获得的资源在未使用完毕之前,资源申请者不能强行地从资源占有者手中夺取资源,而只能由该资源的占有者线程自行释放3)占有且申请条件,线程至少已经占有一个资源,但又申请新的资源;由于该资源已被另外线程占有,此时该线程阻塞;但是,它在等待新资源之时,仍继续占用已占有的资源。4)循环等待条件,存在一个线程等待序列{P1,P2,...,Pn},其中P1等待P2所占有的某一资转载 2020-05-24 00:24:46 · 761 阅读 · 1 评论 -
JVM(2)相关问题
1.对象的创建过程Object o = new Object();获取内存初始化建立关联2. DLC 单例 是否需要加 Volatile必须加!可以防止指令重排序做判断的时候 if(obj != null){} 半初始化+-重排序:比如 初始化和建立关联 2个指令排序调换,导致结果出错...原创 2020-05-15 23:04:04 · 121 阅读 · 0 评论 -
JVM(2)Voletile、内存屏障
高可用、高扩展、高性能volatile前后都会加内存屏障,这个内存屏障可以禁止指令重排序lock: addlVolatile1. 线程可见性boolean flag =true;new Thread(){ while(flag){ } system.output.printer("end")}.start();Thread.sleep(1000);flag=false;线程并不会停止,子线程取得值并未改变2. 禁止指令重...原创 2020-05-15 23:03:39 · 202 阅读 · 0 评论 -
JAVA多线程(1)几种常见锁,及其原理
1. 用户态和内核态JDK早期,sync都是重量级锁,因为申请锁资源必须通过kernel系统调用ring 0,1,2,3 Linux只用了0,30用户态 3内核态2. CAS不需要系统申请锁,通过汇编指令执行compare and swap比较交换JDK早期都是重量级锁,JDK1.6优化,替换重量级锁java代码跟到 compareAndGet 的native代码最终实现 :cmpxchg =cas修改变量值汇编指令:lock cmp...原创 2020-05-15 23:04:42 · 451 阅读 · 0 评论 -
JAVA多线程(1)锁,CAS,volatile 常见问题
抛出一个问题,自由发挥1. 请描述Synchronized和reentrantlock的底层实现以及冲入的底层原理请描述锁的四种状态和升级过程CSA的ABA问题如何解决请谈一下AQS,为什么AQS的是底层CSA+volatile请谈一下队volatile的理解CAS是什么?请描述对象的创建过程对象在内存中的内存布局DCL单例为什么要加volatile解释一下锁的四种状态Object o = new Obj...原创 2020-05-15 23:04:26 · 292 阅读 · 0 评论 -
数据结构篇
Java工具包提供了强大的数据结构。在Java中的数据结构主要包括以下几种接口和类:枚举(Enumeration) 位集合(BitSet) 向量(Vector) 栈(Stack) 字典(Dictionary) 哈希表(Hashtable) 属性(Properties)以上这些类是传统遗留的,在Java2中引入了一种新的框架-集合框架(Collection),我们后面再讨论。枚...原创 2019-05-07 10:19:42 · 116 阅读 · 0 评论