gpt4 book ai didi

java - 在java中测试同步

转载 作者:行者123 更新时间:2023-11-30 04:13:54 26 4
gpt4 key购买 nike

这里我采用了一个字符串锁来进行测试,以了解两个线程的实际流程如何行为正常,但它给了我不可预测的输出。

这是代码...

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);
}
}
}

}

我得到的输出有时就像......

你好17 号你好17 号sleepThread1 之后你好线程1同步1sleepThread2 之后你好线程2同步2

有时...

你好15你好15sleepThread2 之后你好线程2同步2sleepThread1 之后你好线程1同步1

我知道由于 String 对象作为同步锁而得到不同的输出,但我想知道为什么两个线程给出相同的字符串值线程更改该字符串值。

最佳答案

打印相同的 S 值 (17) 时

T1 --> sets S=15 --->enters Syn Block --> prints Hello --> prints S (T2 has set S=17)
T2 -------------> sets S=17 --->enters Syn Block --> print Hello --> prints S

打印相同的 S 值 (15) 时

T1 ------------> sets S=15 --->enters Syn Block --> prints Hello --> prints S 
T2 --> sets S=17 ---> enters Syn Block --> print Hello --> prints S (S=15 set before T2 prints S)

何时打印差异值

T1 --> sets S=15 --->enters Syn Block --> prints Hello --> prints S 
T2 -----------------------------------------------------------------> sets S=17 --->enters Syn Block --> print Hello --> prints S

这里的问题是您更改了锁定对象本身。因此两个线程可以执行相同的代码块,即使它是同步的

关于java - 在java中测试同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18895086/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com