자바 스 레 드 동기 화 함정,빠 진 적 있어 요?

[문제]
스 레 드 가 String 상수 를 신 호 량 으로 사용 하면 동기 화 를 실현 하 는 것 은 어 떻 습 니까?당신 은 써 본 적 이 있 습 니까?
4.567913.위의 이 코드 는 스 레 드 thread 1 과 thread 2 를 동기 화 시 켜 야 하 는데 스 레 드 thread 3 와 thread 4 를 동기 화 시 켜 야 하 는데 결 과 는?
스 레 드 thread 1,thread 2,thread 3,thread 4 를 동기 화 시 켜 멘 붕 을 겪 었 다.
이 결 과 를 초래 한 이 유 는 간단 하 다.상수 탱크 의 원인 으로 모든 값 이'mutex'인 문자열 상수 가 같은 대상 을 가리 키 고 있다.
이것 은 나 로 하여 금 원래 본 또 다른 StringBuilder 에 관 한 글 을 생각 나 게 한다.
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) {
	// t1
	Test t1 = new Test();
	MyThread thread1 = new MyThread();
	MyThread thread2 = new MyThread();
	thread1.test = t1;
	thread2.test = t1;

	// t2
	Test 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());
	}
    }

}
저 자 는 StringBuilder 대상 을 만 들 고 초기 값 은'100'이지 만 실제로는 value 길이 의 char 배열 을 만 들 었 는데 이 value 가 조금 만 더 크 면...

좋은 웹페이지 즐겨찾기