Java线程同步小陷阱,你掉进去过吗?

来源:互联网 发布:沪昆高铁 问题 知乎 编辑:程序博客网 时间:2024/05/04 21:20
【问题】

当一个线程使用String常量作为信号量,来实现同步会如何?你有用过吗?

package test.mult;/** * @ClassName: Test * @author whwang * @date 2012-1-10 下午02:28:39 *  */public class Test {    private String mutex = "mutex";    public void f(String flag) {System.out.println(flag + ", entry mehtod f");synchronized (mutex) {    System.err.println(flag + ", invoke method f....");    try {Thread.sleep(10 * 1000);    } catch (InterruptedException e) {e.printStackTrace();    }}    }    public static void main(String[] args) {// t1Test t1 = new Test();MyThread thread1 = new MyThread();MyThread thread2 = new MyThread();thread1.test = t1;thread2.test = t1;// t2Test t2 = new Test();MyThread thread3 = new MyThread();MyThread thread4 = new MyThread();thread3.test = t2;thread4.test = t2;thread1.start();thread2.start();thread3.start();thread4.start();    }}class MyThread extends Thread {    Test test;    @Override    public void run() {while (true) {    this.test.f(this.toString());}    }}
上面这段代码,本来应该是要实现线程thread1和thread2同步,线程thread3和thread4同步的,但结果呢?

却是使得线程thread1、thread2、thread3、thread4同步了,囧。

导致这结果的理由很简单:由于常量池的原因,所有值为“mutex”的字符串常量,都指向了同一个对象。


这让我想起了原来看过的另一篇关于StringBuilder的文章:

int value = 100;StringBuilder sb = new StringBuilder(value);
作者的本意是,构造一个StringBuilder对象,初始值为“100”,但实际却是开辟了一个长度为value的char数组,如果这个value再大点。。。。。