时间:2021-05-20
上下文:程序运行需要的环境(外部变量)
上下文切换:将之前的程序需要的外部变量复制保存,然后切换到新的程序运行环境
系统调用:(用户态陷入操作系统,通过操作系统执行内核态指令,执行完回到用户态)用户态——内核态——用户态:两次上下文切换
线程wait()方法:将自身加入等待队列,发生了一次上下文切换
notify()方法:将线程唤醒,也发生了上下文切换
Java线程中的锁:偏向锁、轻量级锁、重量级锁。
注意:偏向锁和轻量级锁都没有发生竞争,重量级锁发生了竞争。
偏向锁:可重入和经常使用某一个线程。
轻量级锁:线程之间的切换,但是未发生竞争(在一个时间段只有一个线程使用)
重量级锁:线程时间的竞争。
临界区:多个线程共享临界区,而且存在对临界区的读写。
无所状态:hashcode 31位 年龄age:4位 是否是偏向锁:block_lock:一位:0表示不是偏向锁
偏向锁:thread:54位 线程id epoch 2位,作为批量重偏向的记录 biased_lock:1 表示为偏向锁
轻量级锁:ptr_to_lock_record:62位 表示,锁记录的指针
重量级锁:ptr_to_heavyweight_monitor :62位 表示monitor指针
轻量级锁的流程:
锁记录有两个指针:一个指向自身,一个指向lock对象,当lock对象位state位01时,表示位轻量级锁,此时执行轻量级锁的加锁:交换lock record和markword
锁重入:
同样创建一个LockRecord 但此时cas失败,因为此时lock对象的markword为当前锁记录的指针,置lockrecord指针为null,表示锁重入,并且添加一个锁重入计数器,记录锁重入的次数
解锁:将LockRecord中的lockrecord(此时是markword)和lock对象(Object)中的markword(lockrecord指针)。如果解锁失败,那么轻量级锁就会膨胀为重量级锁。
重量级锁的加锁、解锁、阻塞、唤醒:只有重量级锁有阻塞
如上图:当发生竞争时,新的线程会将object修改为monitor指针,指向重量级锁的monitor(管程),然后进入等待队列,当当前线程结束同步代码块,就会将owner置为0,此时表示没有线程拥有此锁,然后唤醒其他线程,其他线程就会竞争这个锁。
偏向锁的加锁和解锁:新的线程只需要判断lock对象的markword对象中的线程id是否是自己的id,如果是,那么就直接使用这个锁。不用作cas交换,只有第一次获得此锁时需要用cas交换
调用hashcode可以撤销偏向锁,或者对同一个对象发生锁同步时也会撤销偏向锁
偏向锁重定向:对于一个类的多个实现类锁对象,当超过20次重定向时,后面该锁的实例对象就变成了另外一个线程的偏向锁
当发生40次重定向时,该类的所有lock对象就变成了轻量级锁。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文主要介绍了Android多线程之同步锁的使用,分享给大家,具体如下:一、同步机制关键字synchronized对于Java来说,最常用的同步机制就是sync
在Java并发编程的世界里,synchronized和Lock是控制多线程并发环境下对共享资源同步访问的两大手段。其中Lock是JDK层面的锁机制,是轻量级锁,
在上篇文章给大家介绍了java多线程的实现方式,通过本文给大家介绍java多线程实例,对java多线程感兴趣的朋友一起学习吧首先给大家说下多线程的优缺点多线程的
Java中的多线程是一种抢占式的机制,而不是分时机制。抢占式的机制是有多个线程处于可运行状态,但是只有一个线程在运行。共同点:1.他们都是在多线程的环境下,都可
本文承接上一篇文章《Java多线程实例详解(一)》。四.Java多线程的阻塞状态与线程控制上文已经提到Java阻塞的几种具体类型。下面分别看下引起Java线程阻