首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当前正在运行的线程是否在休眠时持有锁?

当前正在运行的线程是否在休眠时持有锁?
EN

Stack Overflow用户
提问于 2015-07-30 17:13:35
回答 1查看 522关注 0票数 0

正如文件上说的

睡觉时线程不会释放它所持有的锁

不过,我的代码片段演示了,它确实释放了锁的

代码语言:javascript
运行
复制
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:这是共享消息

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-30 17:15:29

PersonTWO没有试图获取锁。

请参阅下面的示例,该示例确实演示了睡眠不会释放锁。

代码语言:javascript
运行
复制
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();
    }
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31730110

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档