java多线程解决死锁几种方法,多线程lock的用法
00-1010LOCK它是java.util.concurrent.locks下的一个接口,也是用来处理线程同步问题的。
公共接口锁{ void Lock();void lockInterruptibly()引发InterruptedException布尔tryLock();布尔tryLock(long time,TimeUnit单位)抛出InterruptedExceptionvoid unlock();condition new condition();}lock()获取锁。如果锁不可用,当前线程将被禁用以进行线程调度,并将处于休眠状态,直到获得锁。除非当前线程被中断,否则Lockinterrupt()获取一个锁。如果可能,获取锁并立即返回。如果锁不可用,则当前线程将被禁用用于线程调度目的,并且将处于休眠状态,直到锁被当前线程获得或者其他线程中断当前线程。tryLock()的这种用法确保锁在被获取时被解锁,并且在未被获取时不会尝试解锁。返回布尔类型(真/假)。TryLock(long time,TimeUnit unit)在Uchikoga处于给定等待时间且当前线程未中断的情况下获取锁。如果锁可用,该方法立即返回值true。如果锁不可用,当前线程将被禁用以进行线程调度,并且将处于休眠状态,直到当前线程获得锁、被中断或指定的等待时间到期。解锁()释放锁。NewCondition()返回绑定到此锁实例的新条件实例。因为它只是一个接口,所以我们需要找到它的实现类。在这里,我们将介绍ReentrantLock,它也是我们工作中常用的。
00-1010它是一个可重入的互斥锁。它的基本行为和语义与同步方法和语句访问的隐式监控锁相同,但它具有扩展功能。
说了这么多,我还没带你过一遍。这里有一个例子可以试试。
公共类Lock test { private static Lock Lock=new reentrant Lock();私有静态int count=0;私有静态void add(){ try {//lock . lock();数数;//重新输入lock reduce();}最后{//记得释放锁lock . unlock();system . out . println(count);}}私有静态void reduce(){//lock . lock();count-;//释放锁lock . unlock();} public static void main(String[]args)抛出interrupted exception { for(int I=0;i 100i ) {新线程(LockTest:add)。start();}}}我们发现无论执行多少次,结果都和预期一样,都是0。我们来看看tryLock,直接重写reduce:
private static void reduce 1(){ if(lock . try lock()){ try { count-;}最后{//释放锁lock . unlock();} } else { system . out . println( no );}}通过上面的使用,我们来和Synchronized做个对比。
表面上看,一个是关键词,一个是类。在使用中,Synchronized是隐式的,而Lock需要显示,对代码要求很高。如果忘记释放锁,可能会导致死锁。Lock提供了tryLock方法,使得程序更加灵活。代码显示Lock更加灵活,可以用不同的方式执行。00-1010本节主要讲它的基本用法。可以举一反三,试试什么条件会导致死锁。
关于Java多线程中Lock锁的使用的总结,这篇文章就到这里了。关于锁在Java中使用的更多信息,请搜索热门IT以前的文章或继续浏览下面的相关文章。我希望你将来能支持流行它!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。