ReentrantLock有什么用处?

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

你每个线程都有自己的Lock,当然不行了
需要3个线程用一个Lock

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

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

public static final ReentrantLock lock=new ReentrantLock(); 试试

对的,ymmihw 和 freish 的解答请你看一下,应该像这样实现才是OK的

兄弟是这样的,锁的概念是针对多个线程访问一个对象产生的,也就是说比如现在有个类
[code="java"] public class Test{
public void mytest(){
System.out.println("test");
}
}[/code]

然后呢 有两个线程对象 ThreadA和ThreadB来访问这个Test对象test的mytest()方法。我们假设不加锁的状况,此时线程ThreadA和ThreadB会都去执行mytest。假如mytest里面的逻辑更加复杂 甚至有一些改变数据的操作,那么此时是危险的,这个时候就有了锁的必要性。然后咱们改动Test方法。
[code="java"] public class Test{
public final ReentrantLock lock=new ReentrantLock();

public void mytest(){
try{

lock.lock();

System.out.println("Thread ["+Thread.currentThread().getName()+"]!");

        }finally{   
            lock.unlock();   
        }      }

}[/code]

给它加把锁 ,现在你再执行ThreadA和ThreadB,会发现每次只能一个线程进去,也就是说锁起了作用。

你上面的代码 每个线程执行的是自己的run方法 出不了效果也就在情理之中了。

你多个线程都是用了各自的lock当然不行了,你把lock改成static吧。