public class Test {
public static String str = "abc";
public static void main(String[] args) {
System.out.println("before run" + str);
for (int i = 0; i < 5; i++) {
new Thread(new Runnable() {
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {;}
str =str +"1";
}
}).start();
}
System.out.println("after run" + str);
}
}
나는 불변의 String 클래스에 대한 테스트, 그것은 내가 동기화 된 물건을String은 JAVA에서 불변의 클래스인가? 그렇다면이 기능을 사용하는 방법은 멀티 스레드 프로그래밍입니까?
할 필요 없다 생각 때문에 스레드 안전 클래스입니다 그러나 결과는 와 함께 보여줍니다 때 "ABC 전에"저를 충격했다 와 "abc 후에".
내가 그 Thread.sleep (100)을 제거했을 때; 결과는 "abc before"및 "abc1111 after"가되었습니다.
public static String str이 수정 되었습니까? 그 이유는 무엇입니까?
당신은 *, 당신이하고있는 * 문자열을 수정하지 않을 수 없습니다와는 아무 상관 없습니다 변수를 참조하는 * 수정. 왜 너 한테 줄까? – shmosel
"(실행 전"과 같이) 문자열의 값을 수정할 수 없다는 것을 알지 못합니다 ... 실제로 변수의 값을 변경할 수는 있지만 유형이 변경되지 않는 것과는 아무런 관련이 없습니다 ... –
'문자열을 변경하지 마십시오 (문자열은 변경되지 않으므로 불가능합니다). 정적 변수에 새 문자열을 지정합니다. 그것은 불변성과 스레드와 아무 관련이 없습니다.'String s = "a"를 할 수있는 가능성에 대해서만; s = "b";'. –