首页 > 其他分享 >juc总结

juc总结

时间:2022-10-11 20:55:27浏览次数:39  
标签:总结 juc await lock ReentrantLock 加锁 线程 唤醒

总结

目录

Lock

ReentrantLock: 独占锁
加锁 加锁失败的话, 会创建节点绑定在锁维护的队列节点上,并进行阻塞睡眠,当unlock 时,唤醒队列上的线程
newCondition await signal

ReentrantReadWriteLock 读写锁

LockSupport: LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程

CountDownLatch countDown await

CyclicBarrier await

Semaphore acquire release

T1 重入锁 加锁后调用的方法加通向的锁, 锁计数+2
加锁方法碰到异常后会释放锁,其他线程会访问到错误的同步代码块数据 进行事务回滚

MyContainer4 互相叫醒 wait 释放锁 叫醒的时候要把锁在还给它
5、CyclicBarrier和CountDownLatch(await countDown)的区别

两个看上去有点像的类,都在java.util.concurrent下,都可以用来表示代码运行到某个点上,二者的区别在于:

(1)CyclicBarrier的某个线程运行到某个点上之后,该线程即停止运行,直到所有的线程都到达了这个点,所有线程才重新运行;CountDownLatch则不是,某线程运行到某个点上之后,只是给某个数值-1而已,该线程继续运行

(2)CyclicBarrier只能唤起一个任务,CountDownLatch可以唤起多个任务

(3)CyclicBarrier可重用,CountDownLatch不可重用,计数值为0该CountDownLatch就不可再用了

synchronized和ReentrantLock的区别

synchronized是和if、else、for、while一样的关键字,ReentrantLock是类,这是二者的本质区别。既然ReentrantLock是类,那么它就提供了比synchronized更多更灵活的特性,可以被继承、可以有方法、可以有各种各样的类变量,ReentrantLock比synchronized的扩展性体现在几点上:

(1)ReentrantLock可以对获取锁的等待时间进行设置,这样就避免了死锁
Lock lock = new ReentrantLock(); lock.lock();lock.unlock() 手动加锁手动释放, 遇到异常也不释放,所以写在finally
可以尝试lock locked = lock.trylock(5, TimeUnit.Seconeds) 在指定时间内获得锁,获得不到就往下执行
或者主动让别人把锁释放(lock.lockInterruptibly 加锁 对外面的interrupt打断作出响应)
ReentrantLock( new ReentrantLock(true);公平锁 但是效率低谁等时间长谁用 而不是抢占式)
wait 往往和while使用
lock.newCondition() 可以指定叫醒哪个 await signalAll

(2)ReentrantLock可以获取各种锁的信息

(3)ReentrantLock可以灵活地实现多路通知

另外,二者的锁机制其实也是不一样的。ReentrantLock底层调用的是Unsafe的park方法加锁,synchronized操作的应该是对象头中mark word,

//A线程获得锁后, 其他线程获取 获取不到会将自己添加到队列中, 等待 A 执行完成后 A 去唤醒队列上的第一个线程,

    // 如果 期间使用 到condition 会 await 会将当前线程添加到conditon 持有 await 节点上, 然后将lock 上等待的线程唤醒
    // B 线程解锁时 不会吧A 线程唤醒, 因为A不在等待队列上, 只能用 condition signal 来唤醒, 唤醒后,会将condition 上的waiter 增加到lock 的等待线程上

countdownlatch 则是 一次性锁, await 后会 增加到等待队列上, coundown 达到数量减到0后,会唤醒所有等待队列上的线程
CyclicBarrier 到达后会await 暂停 达到数量后 会被唤醒, 其实内部也就是condition, 达到一个await

FutureTask 相当于占位符, get 的时候,如果任务没有执行完成,get的线程会加入到等待队列上,并休眠, 当 run 完成时 回去唤醒等待队列上的线程

ForkjoinPool RecursiveTask

Semaphore 创建的时候声明大小, acquire 超过这个数量的时候就睡眠 release 会去唤醒这些等待的线程

Semaphore 和 ReentrantLock 区别:

  1. 锁可重入, 信号量重入可能会造成死锁, 没法释放
  2. 死锁恢复, 信号量在任意线程可释放许可,可释放, 锁 只能持有者才能释放
  3. 抛出异常,其他线程调用release ,不会 锁会爆 unlock
  4. 信号量任意线程可修改信号量, 锁只有持有线程才能修改

何时使用, 需要非持有释放的话,可使用信号量, 否也就用锁

标签:总结,juc,await,lock,ReentrantLock,加锁,线程,唤醒
From: https://www.cnblogs.com/mxz1994/p/16782520.html

相关文章

  • 1、前端开发:HTML知识总结——网页结构
            HTML的全称为超文本标记语言,是一种标记语言。它包括一系列标签.通过这些标签可以将网络上的文档格式统一,使分散的Internet资源连接为一个逻辑整体。HTML文本......
  • 前端面试总结15-vue高级特性
    1.自定义v-model:    2.$nextTick与refsVue是异步渲染,data改变后Dom不会立即渲染,$nextTick会在DOM渲染之后被触发,以获取最新的DOM节点refs用于获取dom节点 ......
  • 2022-2023-1 20211319《信息安全专业导论》第七周学习总结
    2021-2022-120211326《信息安全专业导论》第七周学习总结作业信息|计算机科学概论第8章||看漫画学Python第8、10章|教材学习内容总结计算机科学概论第8章:1、抽象数......
  • 【博学谷学习记录】超强总结,用心分享|狂野架构师redis淘汰机制
    目录redis淘汰机制淘汰策略LRU算法LFU算法如何获取及设置内存淘汰策略redis淘汰机制淘汰策略1.noeviction(默认策略):默认情况下,Redis在使用的内存空间超过maxmemory......
  • 行测总结
    行测总结一、数字推理变化趋势平缓:做差做和(两、三)多级做差、做和变化趋势陡峭:做幂\(11^2=121,\12^2=144,\13^2=\bold{169},\14^2=\bold{196},\15^2=\b......
  • Mysql关于时间的一些总结
    一、mysql获取当月的第一天获取当前时间SQL:SELECT结果:2017-12-27获取当前日期是当月的多少天SQL:SELECTDAY结果:27获取当月第一天SQL:SELECTDATE_ADD(CURDATE(),INTER......
  • 约束-详细总结
    *概念:对表中的数据进行限定,保证数据的正确性、有效性和完整性。*分类: 1.主键约束:primarykey 2.非空约束:notnull 3.唯一约束:unique 4.外键约束:fo......
  • 软件项目部署时注意事项及关键点总结
    一、部署之前1.确认目标服务器1.1确认服务器操作系统及版本:Windows、Linux等;1.2确认服务器环境及地址:生产环境、开发环境、测试环境、演示环境等;1.3确认服务器部署......
  • 万字肝货 | 超全总结,Linux常用磁盘命令、文件命令!
    目录  ​​1、知识引入​​​  ​​2、linux操作系统的产生过程​​  ​​3、linux优点​​​  ​​4、linux体系结构​​​  ​​5、linux内核及发行版本​......
  • 总结了一些指针易出错的常见问题(一)
    计算机是如何从内存单元中存取数据的呢?从程序设计的角度看,有两种办法:一是通过变量名;二是通过地址。程序中声明的变量是要占据一定的内存空间的,例如,C语言中整型变量占2字节,实......