ReentrantLock有什么用处?

2019-03-25 13:33|来源: 网路

如题所述,发现调用 ReentrantLock.lock()方法时候并不能造成死锁。

问题补充:
Rainbow702 写道
官方:
一个可重入的互斥锁定 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义,但功能更强大。ReentrantLock 将由最近成功获得锁定,并且还没有释放该锁定的线程所拥有。当锁定没有被另一个线程所拥有时,调用 lock 的线程将成功获取该锁定并返回。如果当前线程已经拥有该锁定,此方法将立即返回。可以使用 isHeldByCurrentThread() 和 getHoldCount() 方法来检查此情况是否发生。

它提供了lock()方法:
如果该锁定没有被另一个线程保持,则获取该锁定并立即返回,将锁定的保持计数设置为 1。
如果当前线程已经保持该锁定,则将保持计数加 1,并且该方法立即返回。
如果该锁定被另一个线程保持,则出于线程调度的目的,禁用当前线程,并且在获得锁定之前,该线程将一直处于休眠状态,此时锁定保持计数被设置为 1。

按照官方的解释,如果线程A调用了lock方法,线程B调用lock方法时候应该是被禁用的,实际上线程B并没有在调用lock方法时候死锁!
以下是测试代码
package net.kaixindog.test;

import java.util.concurrent.locks.ReentrantLock;

public class T extends Thread{
		public final ReentrantLock lock=new ReentrantLock();
		private int threadId;
		
		public T(int threadId){
			this.threadId=threadId;
		}
		public void run(){
			try{
				lock.lock();
				System.out.println("Thread ["+threadId+"]lock!");
				System.out.println("Thread ["+threadId+"]unlock!");
				System.out.println("Thread ["+threadId+"]"+lock.isHeldByCurrentThread());
			}finally{
				lock.unlock();
			}
		}
		
	/*	public void run(){
			synchronized(lock){
				System.out.println("Thread ["+threadId+"]lock!");
				System.out.println("Thread ["+threadId+"]unlock!");
			}
		}*/
	}


package net.kaixindog.test;

/**
 * net.kaixindog.test
 * @author lixm
 * @date   2011-8-19
 * description:
 */
public class ReentrantLockTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		T t1=new T(1);
		T t2=new T(2);
		T t3=new T(3);
		t1.start();
		t2.start();
		t3.start();
	}
	
	

}

相关问答

更多
  • 可以组装和维护计算机。
  • 那要看你对证书的理解,证书并不是越多越好,也不是因为你比别人多了一个证书,用人单位就会聘用你,而且也要看年一的工作能力,证书充其量只不过是一个参考而已。 例如,目前我国对IT人才的需求仍然很大,许多非计算机专业的人都是半路出家进入IT业。在没有专业文凭的情况下,IT认证证书就成了重要的能力证明,这导致IT认证持续升温。在个人的职业生涯中,IT证书将发挥举足轻重的作用。但是,大家也不要将IT证书看得过重,不要简单地为了证书而培训,而应该时刻对IT证书保持一种清醒的认识,这样才能有助于自己涉足IT行业。笔者认为 ...
  • 一般来说,Python中有两个内建的模块用于处理命令行参数: 一个是 getopt,《Deep in python》一书中也有提到,只能简单处理 命令行参数; 另一个是 optparse,它功能强大,而且易于使用,可以方便地生成标准的、符合Unix/Posix 规范的命令行说明。 示例如下: ? from optparse import OptionParser parser = OptionParser() parser.add_option("-p", "--pdbk", action="store_t ...
  • 安装了MYSQL软件可以去数据库文件进行简单明了的操纵,MYSQL用于开发小型系统效率极高,经常与PHP合用,来开发网站,大学时我同学好几个就是用这套系统作的网站。 同样,MYSQL便于开发,但安全性也差,所以建议开发大型系统时不要使用,而且像这类数据库软件最好在服务器上跑,这样系统工作效率高,而且安全...
  • 存储数据,实在想要知道为什么用oracle的话,可以找oracle的客服问一下,然后他(她)就会告诉你这个东西有什么用,用了对你有什么好处,当然其中是有些水分的。
  • 学习Linux的心得 通过这几年来对Linux的学习,一步一步摸着石头过河,到现在才刚刚上岸。我能起的作用可能可以告诉你一些学习的方法,当你遇到困难的时候有个人在旁边给予帮助。说句心里话,对于Linux的掌握我还只能算是很粗的东西,因为看了很多大师们的东西以后,发现自已离他们真得还很远。我不是要打击你的意思,是告诉你实情。但也可以告诉你,就这一点现在还是比较好混口饭吃。对她了解掌握的越深,你会发现他几乎什么都能做,有了实现自已商业机会的平台。 学习Linux分好几种层次,我个人觉得可以用中学里学的课文《 ...
  • 一般是你安装了显卡驱动后产生的, 根据你显卡的不同,部分可以对桌面、颜色、大小、 字体甚至多屏幕模式进行细致的调整。
  • MYSQL,是数据库的一种,轻量级,免费,开放源代码的数据库存储系统. 采纳哦
  • 安装了MYSQL软件可以去数据库文件进行简单明了的操纵,MYSQL用于开发小型系统效率极高,经常与PHP合用,来开发网站,大学时我同学好几个就是用这套系统作的网站。 同样,MYSQL便于开发,但安全性也差,所以建议开发大型系统时不要使用,而且像这类数据库软件最好在服务器上跑,这样系统工作效率高,而且安全...
  • 阅读关于android:persistent的官方指南 应用程序是否应始终保持运行 - 如果应该,则为“true”,否则为“false”。 默认值为“false”。 应用程序通常不应设置此标志; 持久性模式仅适用于某些系统应用程序。 Read official guide line about android:persistent Whether or not the application should remain running at all times — "true" if it should, ...