首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

java中ReentrantLock彻底解决并发线程的无限等待

马 克-to-win:上面的例子,只能做到根据请求Synchronized方法的队列里的线程的数量,决定我是否进入队列等待。但是一旦决定了等待,进入 了等待队列以后,就无法退出队列。想达到这个效果,必须要用到ReentrantLock的技术。ReentrantLock翻译成中文就是可重入锁。下面这段话比较难,新手可忽略。和可重入锁相对的就是不可重入锁,又名自旋锁。为什么叫不可重入锁?因为一旦进入一个带锁的方法,你在这个方法当中,如果想再进入另外一个带锁的方法,就进不去了,好像自己给自己上了锁(自旋)因为你在第一个方法当中你还没有解开锁。而可重入锁在判断中加了一条是不是本个线程?如是,就随便进入当前对象所有带锁的方法。如果对我以上这段话,老手也是不理解的话,可参考我参考目录中的一个参考网页。注意sun公司的ReentrantLock是个类,而sun公司的Lock是个接口。所以为求简单,我们的例子中就用ReentrantLock,ReentrantLock就是为了解决 Synchronized技术的很多弊病而生的。缺点就是使用复杂,简单问题还用 Synchronized就挺好。马克-to-win:因为ReentrantLock类中的lockInterruptibly();方法能够让正在想 获得锁的线程被其他线程中断(见下例),从而打消原来要获得锁的计划。当然如果没有其他的线程占有锁的话,lockInterruptibly();方法也可以让当 前线程从容获得锁。

03

新来一个技术总监:禁止戴耳机写代码,发现就扣绩效。。

点击关注公众号,Java干货及时送达 前言 是的,小李(化名)上班戴耳机被新来的技术总监批了。。 事情是这样的,本来小李所在的公司也没有规定上班时间不能戴耳机写代码,之前都戴的好好的,某次开技术会议,时间到了,小李没有按时间来(也许是写代码忘神了),新来的技术总监就站在会议室门口隔空叫他,哪知吼了两三遍,小李依然无动于衷,他干脆直接跑过去叫了。 后来听说小李事后被总监批了,批的是没有按时间参加会议,虽然和耳机没有直接关系,但却是因为戴耳机写代码引起的,也是因为这事,为第二天的大新闻埋下了伏笔…… 第二天,

03

理解上下文切换带来的性能影响

在多任务操作系统中,为了提高CPU的利用率,可以让当前系统运行远多于CPU核数的线程。但是由于同时运行的线程数是由CPU核数来决定的,所以为了支持更多的线程运行,CPU会把自己的时间片轮流分给其他线程,这个过程就是上下文切换。   导致上下文切换的原因有很多,比如通过wait()、sleep()等方法阻塞当前线程,这时CPU不会一直等待,而是重新分配去执行其他线程。当后续CPU重新切换到当前线程时,CPU需要沿着上次执行的指令位置继续运行。因此,每次在CPU切换之前,需要把CPU寄存器和程序计数器保存起来,这些信息会存储到系统内核中,CPU再次调度回来时会从系统内核中加载并继续执行。简而言之,上下文切换,就是CPU把自己的时间片分配给不同的任务执行的过程。

04
领券