java - 当前正在运行的线程在 sleep 时是否持有锁?

标签 java multithreading

正如文档所说

while sleeping a Thread does not release the locks it holds

但是我的代码片段表明它确实释放了锁定

public class SynchronizationTest {

    public static void main(String[] args) {
        Common c = new Common();
        new PersonONE(c);
        new PersonTWO(c);
    }
}

class Common {
    private String message = "This is shared message";
    public String getMessage() {
        return message;
    }
}

class PersonONE extends Thread {
    private Common c;
    public PersonONE(Common c) {
        this.c = c;
        start();
    }
    @Override
    public void run() {
        synchronized (c.getClass()) {
            for (int i = 0; i < 5; i++) {
                System.out.println("PersonONE: " + c.getMessage());
                try {
                    Thread.currentThread().sleep(100);
                } catch (InterruptedException e) {}
            }
        }
    }
}

class PersonTWO extends Thread {
    private Common c;
    public PersonTWO(Common c) {
        this.c = c;
        start();
    }
    @Override
    public void run() {
        for (int i = 0; i < 5; i++) {
            System.out.println("PersonTWO: "+c.getMessage());
            try {
                Thread.sleep(100);
            } catch (InterruptedException e){}
        }
    }
}

输出

PersonONE:这是共享消息
PersonTWO:这是共享消息
PersonONE:这是共享消息
PersonTWO:这是共享消息
PersonONE:这是共享消息
PersonTWO:这是共享消息
PersonONE:这是共享消息
PersonTWO:这是共享消息
PersonONE:这是共享消息
PersonTWO:这是共享消息

所以,问题是:我错在哪里?

最佳答案

PersonTWO 不会尝试获取锁。

请参阅下面的示例,该示例确实证明了 sleep 不会释放锁。

private static class Locker implements Runnable {
    private final Object lock;
    private final String message;

    private Locker(final Object lock, final String message) {
        this.lock = lock;
        this.message = message;
    }

    @Override
    public void run() {
        try {
            synchronized (lock) {
                for (int i = 0; i < 10; i++) {
                    System.out.println(message);
                    Thread.sleep(1000);
                }
            }
        }
        catch (InterruptedException ex) {

        }
    }
}

public static void main(String[] args) {
    final int numThreads = 2;
    final Object lock = new Object();
    for (int i=0;i<numThreads;i++) {
        new Thread(new Locker(lock, "Hello - " + i)).start();
    }
}

关于java - 当前正在运行的线程在 sleep 时是否持有锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31730110/

相关文章:

C++ 将在类中创建的线程共享同一个类变量吗?

java - 为什么String是一个类?

java - 使用 jsoup 解析保留非 HTML 元素

java - 具有 Spring Security 的 Spring MVC 测试 Controller

java - 在不同的服务器上运行 Web 应用程序和核心逻辑

multithreading - boost::asio::strand 在 Ubuntu 11.04 (boost_all_dev 1.42) 上是否损坏

java - 验证 java 中的模式

c++ - C++编译器如何保证常量成员变量的线程安全?

java - CompletableFuture : after async call, 当前线程中的处理结果

c# - 进度条行为异常