gpt4 book ai didi

java - 同步块(synchronized block)如何工作?

转载 作者:行者123 更新时间:2023-11-29 07:25:25 24 4
gpt4 key购买 nike

我正在学习多线程。我已经编写了一个程序,使用同步来使用两个线程打印 10 和 5 的表。虽然 synchronized 方法给我预期的结果,但 synchronized block 却没有。我究竟做错了什么?

public class SynchronizationDemo {

public static void main(String[] args) {
Thread1 t=new Thread1(10);
Thread1 t1=new Thread1(5);
Thread thread1=new Thread(t);
Thread thread2=new Thread(t1);
thread1.start();
thread2.start();
}
//synchronized method
/*public static synchronized void printTable(int num) {
for (int i = 1; i <= 10; i++) {
System.out.println(num*i);
try {
Thread.sleep(1000);
}catch(InterruptedException ie){
ie.printStackTrace();
}
}
}*/
//synchronized block
public void printTable(int num)
{
synchronized(this){
for (int i = 1; i <= 10; i++) {
System.out.println(num*i);
try {
Thread.sleep(1000);
}catch(InterruptedException ie){
ie.printStackTrace();
}
}
}
}
}

class Thread1 implements Runnable{
int num;
Thread1(int num){
this.num=num;
}
@Override
public void run() {
new SynchronizationDemo().printTable(num);
}
}

代码输出:105个102030152040255060307035408090后4510050

预期输出:102030405060708090后1005个101520253035404550

最佳答案

这两种方法之间的主要区别在于一个小而重要的细节。

  • 您的同步块(synchronized block)正在this上同步。

  • 您的同步方法(注释掉的那个!)是一个static 方法。这意味着它正在 SynchronizationDemo 类对象上进行同步!!

但这并不能解释一切。另一件事是您调用方法的方式。

    new SynchronizationDemo().printTable(num);

您正在创建一个新实例,然后在其上调用方法。

  • 当您调用静态方法时,使用哪个实例没有区别...因为您是在 Class 对象上进行同步。

  • 调用实例方法时,实例是不同的,因此根本不存在互斥。只有当两个线程在同一个对象上同步时,您才能获得互斥和正确的同步。

关于java - 同步块(synchronized block)如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54086295/

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