首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程并发-使用字符串对象的锁进行同步

线程并发-使用字符串对象的锁进行同步
EN

Stack Overflow用户
提问于 2012-01-01 01:22:17
回答 1查看 149关注 0票数 0
代码语言:javascript
复制
class ZiggyTest{

    public static void main(String[] args){

        RunnableThread rt = new RunnableThread();

        Thread t1 = new Thread(rt);
        Thread t2 = new Thread(rt);
        Thread t3 = new Thread(rt);

        t1.start();
        t2.start();
        t3.setPriority(10);
        t3.start();

        try{
            t3.join();
            t2.join();
            t1.join();

            System.out.println("Joined");
        }catch(InterruptedException e){System.out.println(e);}


        Thread t4 = new Thread(new RunnableThread());
        Thread t5 = new Thread(new RunnableThread());
        Thread t6 = new Thread(new RunnableThread());

        t4.start();
        t5.start();
        t6.start();
    }

}

上面的测试产生以下输出

代码语言:javascript
复制
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-2
Thread-2
Thread-2
Thread-2
Thread-2
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1
Joined
Thread-3
Thread-3
Thread-4
Thread-4
Thread-3
Thread-4
Thread-5
Thread-4
Thread-3
Thread-4
Thread-5
Thread-3
Thread-5
Thread-5
Thread-5

我不明白为什么最后三个线程不像前三个线程那样使用String对象作为共享锁。即使最后三个线程使用不同的“RunnableThread”实例,它们是否应该同步,因为在字符串常量池中只有一个“str”副本?

谢谢

编辑

哦..。我忘了包括RunnableThread。

代码语言:javascript
复制
class RunnableThread implements Runnable{

    String str = "HELLO";

    public void run(){
        runMe();
    }

    public synchronized void runMe(){
        for (int a : new int[]{1,2,3,4,5}){
            System.out.println(Thread.currentThread().getName());
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-01 01:29:11

您的线程不会在任何String对象上同步,更不用说同一个对象了,所以我不确定这个想法从何而来。由于下面这一行中的synchronized关键字,它们在RunnableThread对象本身上同步:

代码语言:javascript
复制
public synchronized void runMe(){

对最后三个线程使用单独的RunnableThread对象意味着它们独立运行。

现在,如果您真的希望锁定全局String对象,则该方法将如下所示

代码语言:javascript
复制
public void runMe(){
    synchronized (str) {
        for (int a : new int[]{1,2,3,4,5}){
            System.out.println(Thread.currentThread().getName());
        }
    }
}

这将是一个好主意,使str final

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8689470

复制
相关文章

相似问题

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