在这里,我采用了一个字符串锁来进行测试,以了解两个线程的实际流如何表现,但它给了我不可预测的输出。
这是代码...
public class SyncCall {static SyncTesting sync1 = new SyncTesting();
static Runnable r1=new Runnable() {
public void run() {
try {
sync1.s=new String("15");
Thread.currentThread().setName("Thread1");
sync1.testme();
// Thread.sleep(1000);
System.out.println(Thread.currentThread().getName());
System.out.println("sync1");
} catch (Exception ex) {
Logger.getLogger(SyncCall.class.getName()).log(Level.SEVERE, null, ex);
}
}
};
static Runnable r2=new Runnable() {
public void run() {
try {
sync1.s=new String("17");
Thread.currentThread().setName("Thread2");
sync1.testme();
//Thread.sleep(1000);
System.out.println(Thread.currentThread().getName());
System.out.println("sync2");
} catch (Exception ex) {
Logger.getLogger(SyncCall.class.getName()).log(Level.SEVERE, null, ex);
}
}
};
public static void main(String args[]){
Thread th1=new Thread(r1);
Thread th2=new Thread(r2);
th1.start();
th2.start();
}
}
public class SyncTesting {String s=new String("abc");
//final Object s=new Object();
public void testme(){
synchronized(s){
try {
System.out.println("Hello");
System.out.println(s);
// s=new String("18");
Thread.sleep(1000);
System.out.println("Hello after sleep" +Thread.currentThread().getName());
} catch (Exception ex) {
Logger.getLogger(SyncTesting.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
我得到的输出就像有时......
Hello 17 Hello 17 在 sleepThread1 之后 Hello Thread1 sync1 在 sleepThread2 之后 Hello Thread2 sync2
而有时...
Hello 15 Hello 15 在 sleepThread2 之后的 Hello Thread2 sync2 在 sleepThread1 之后的 Hello Thread1 sync1
我知道我得到不同的输出是因为 String 对象作为同步中的锁,但我想知道为什么两个线程给出相同的字符串值而另一个线程更改该字符串值。