Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 尝试了嵌套锁,但仍然面临死锁_Java_Multithreading_Thread Safety - Fatal编程技术网

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中的方法相同。