嗨我想了解下面的代碼的輸出。根據我的理解,輸出可能會不同的第一和第二個線程。但是當我執行下面的代碼很多次,我仍然得到兩個線程的值相同。無論我是錯的還是正確的,都可以請一些人點亮。多線程程序的輸出
package com.vikash.Threading;
public class ThreadLocalExample {
public static class MyRunnable implements Runnable {
@SuppressWarnings("unused")
private ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>();
D d=new D();
@Override
public void run() {
//threadLocal.set((int) (Math.random() * 100D));
d.setX((int) (Math.random() * 100D));
//System.out.println(Thread.currentThread().getName()+" "+threadLocal.get());
System.out.println(Thread.currentThread().getName()+" "+d.getX());
try {
Thread.sleep(200);
} catch (InterruptedException e) {
}
//System.out.println(Thread.currentThread().getName()+" "+threadLocal.get());
//System.out.println(Thread.currentThread().getName()+" "+d.getX());
}
}
public static void main(String[] args) throws InterruptedException {
MyRunnable sharedRunnableInstance = new MyRunnable();
Thread thread1 = new Thread(sharedRunnableInstance);
Thread thread2 = new Thread(sharedRunnableInstance);
thread1.start();thread1.setName("First");
thread2.start();thread2.setName("Second");;
thread1.join(); //wait for thread 1 to terminate
thread2.join(); //wait for thread 2 to terminate
}
}
@Vikash:代碼缺乏同步的,這意味着,正式,結果未完全指定。換句話說,你不能保證結果會是什麼。但是,您也沒有任何保證,如果您多次運行它,*會看到不同的結果。可能發生的情況是,在特定的系統中,在特定的JVM版本,Java編譯器等中,它可能會發生,您將始終看到相同的結果。但是,正式的說法(即根據JVM規範),你的代碼不能保證有任何特定的結果。 –
@Vikash:你可以通過多次運行「證明」自己的唯一一件事是:如果你看到不同的結果,你就有*缺乏同步的證據。但是,如果您運行多次並始終看到相同的結果,則您沒有任何證據。測試同步問題真的很難! –