Java 尝试了嵌套锁,但仍然面临死锁
这是我试图演示嵌套锁问题的代码Java 尝试了嵌套锁,但仍然面临死锁,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,这是我试图演示嵌套锁问题的代码 import java.util.concurrent.locks.*; class SharedResource{ private static final Lock lock = new ReentrantLock(); private void methodThree(String name,int x) throws Exception{ lock.lock(); while(x <=
import java.util.concurrent.locks.*;
class SharedResource{
private static final Lock lock = new ReentrantLock();
private void methodThree(String name,int x) throws Exception{
lock.lock();
while(x <= 15){
System.out.println("METHOD-THREE / THREAD-NAME : "+name+" NUM-VAL "+x);
x++;
Thread.sleep(250);
}
}
private void methodTwo(String name,int x) throws Exception{
lock.lock();
while(x <= 10){
System.out.println("METHOD-TWO / THREAD-NAME : "+name+" NUM-VAL "+x);
x++;
Thread.sleep(250);
}
methodThree(name,x);
}
public void methodOne(String name,int x) throws Exception{
try{
lock.lock();
while(x <= 5){
System.out.println("METHOD-ONE / THREAD-NAME : "+name+" NUM-VAL "+x);
x++;
Thread.sleep(250);
}
methodTwo(name,x);
}finally{
lock.unlock();
}
}
}
class MyRequestREQ extends Thread{
private SharedResource res;
private int num = 1;
MyRequestREQ(SharedResource res,String name){
super(name);
this.res = res;
}
@Override
public void run(){
try{
res.methodOne(Thread.currentThread().getName(),num);
}catch(Exception e){
System.out.println(e);
}
}
}
public class LockCountPractise{
public static void main(String [] args){
SharedResource resource = new SharedResource();
MyRequestREQ[] requests = new MyRequestREQ[]{
new MyRequestREQ(resource,"JACK"),
new MyRequestREQ(resource,"JILL"),
new MyRequestREQ(resource,"JASON")
};
for(int x=0; x < requests.length;x++){
requests[x].start();
}
}
}
import java.util.concurrent.locks.*;
类共享资源{
private static final Lock=new ReentrantLock();
私有void methodThree(字符串名,int x)引发异常{
lock.lock();
而(x方法3中没有解锁,因此当第一个线程完成时,其他线程无法继续,因为它们无法获得锁
我需要解锁类的所有方法中的锁吗
共享资源
是,因为每次调用lock()
:
如果当前线程已经持有锁,则持有计数为
递增1,该方法立即返回
见:
作为一个建议:你可以在方法1中获得锁,然后在方法3中释放它。所以会有1个锁1个解锁,你会没事的。不需要3个锁解锁周期
实际上,这取决于你想要什么样的行为:
- 要让不同的线程获得计数器之间的锁(thread1计数到5,然后thread3出现,然后thread1继续计数),每个方法都需要锁定解锁
- 要获得一个线程的开始和结束计数没有任何干扰,你需要1锁解锁
杰克锁了锁三次,但只松开了一次。Lock()
正在计数:
lock()
如果当前线程已经持有锁,那么持有计数将增加1,并且方法立即返回
解锁()
如果当前线程是此锁的持有者,则保持计数将递减。如果保持计数现在为零,则释放锁
(JavaDoc)感谢您的回复,我可以在第一个方法中锁定解锁,移除方法2和3中的所有锁定,这是正确的方法吗?正确的方法取决于您想要什么。正如在我编辑的答案中,1 lock unlock(锁定解锁)使线程一个接一个地计数,还请注意,当您使用1 lock unlock(锁定解锁)时,对于这种特殊情况,在方法1或方法3中的方法相同。