자바 스 레 드 동기 화 함정,빠 진 적 있어 요?
스 레 드 가 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 가 조금 만 더 크 면...
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.