线程同步的方法:sychronized,lock,reentrantLock,Condition等
在讲解之前 先要了解java线程和os线程的关系
java中的线程和os 中的线程是一一对应的
thread.start() 调用 run方法的原理
java中start
方法会调用native void start0()
本地方法,这实际上就是以个c文件,存放在java.exe中,在c中 我们调用pthread_create(pthread_t thread, const pthread_attr_t attr, void (start_routine) (void ), void argL)方法, 这个方法是os创建线程的方法,第三个参数我们start_thread()方法,利用JNI 调用run() 方法。
wait 与while 配合使用
synchronized
Mark word
中,unused 25 bit , hash 31 bit ,| unused 1 age 4 biased_lock 1 lock 2
无锁 001
偏向锁 101 jvm会
延迟加载
偏向锁,大约4s的时间; 轻量锁与hashcode不能同时存在,是互斥的。当开启偏向锁时,但是并没有线程持有时,偏向锁存在一个可偏向状态,轻量锁 00
在多线程交替执行时并不会出现重量锁,而是轻量锁,
重量锁 10
多线程互斥执行时会出现重量锁,使用wait操作时会直接变成重量锁。
gc 11
锁的膨胀过程
偏向锁一般情况下只能在偏向自己, 1.当有第二个线程交替执行时,一般会膨胀成轻量锁,特殊情况如第一个线程执行完释放时,第二 个线程获取到的线程id还是第一个线程的id,这样看起来是一种重偏向,其实还是一直偏向自己。 2.当同一个对象连续膨胀为轻量锁约20次时,jvm就会认为当前对象存在问题,会修改对象头中的epoch值,这时会会存在批量 偏向的现象,前20个还是轻量锁,但后面的会重偏向第二个线程。
Last updated
Was this helpful?