Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.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 - Fatal编程技术网

Java 为什么所有线程都有锁?

Java 为什么所有线程都有锁?,java,multithreading,Java,Multithreading,我正在学习Java中的多线程。我正在使用jdk1.8。只是遇到了ReentrantLock的tryLock(长超时,@NotNull Java.util.concurrent.TimeUnit)。 以下是我的代码: public class TimeLock implements Runnable { static ReentrantLock lock = new ReentrantLock(); @Override public void run() {

我正在学习Java中的多线程。我正在使用jdk1.8。只是遇到了
ReentrantLock
tryLock(长超时,@NotNull Java.util.concurrent.TimeUnit)
。 以下是我的代码:

public class TimeLock implements Runnable {
    static ReentrantLock lock = new ReentrantLock();
    @Override
    public void run() {
        try {
            if (lock.tryLock(4000, TimeUnit.SECONDS)) {
                System.out.println(Thread.currentThread().getName() + " get lock.");
                Thread.sleep(6000);
            } else {
                System.out.println("get lock failed");
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        } finally {
            if (lock.isHeldByCurrentThread()) {
                lock.unlock();
            }
        }
    }

    public static void main(String[] args) {
        TimeLock timeLock = new TimeLock();
        Thread t1 = new Thread(timeLock, "First-Thread");
        Thread t2 = new Thread(timeLock, "Second-Thread");
        t1.start();
        t2.start();
    }
  }
我的问题是:为什么第一个线程和第二个线程都得到了锁?tyrLock()不是意味着在指定的时间内尝试获得锁吗

例如,第一个线程获得锁,然后保持6秒钟。同时,第二个线程不会在4秒钟内获得锁。但结果与我的逻辑推理不同

我只是尝试在没有参数的情况下使用
lock.trylock()
,它工作正常。谢谢大家。

lock.trylock(4000,TimeUnit.SECONDS)
语句中,您指定了4000秒,而不是4秒

将时间单位更改为TimeUnit.millizes或将值更改为4以生成预期用例

通过上述更改,您可以获得以下输出:

第一个线程得到锁。
获取锁失败