为什么我的同步方法不能正常工作?

Leo*_*ott 0 java multithreading synchronized synchronized-block

我有一个打印计数器的同步方法,我有 4 个线程,所以我期望计数器的最终值为 400000,因为我的计数器是一个静态变量。

但每次我运行代码时,它都会给我不同的计数器值。

以下是我的代码:

class MyThread implements Runnable{

    private static int counter=1;
    @Override
    public void run() {
        try {
            this.syncMethod();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    public synchronized void syncMethod() throws InterruptedException{
        for(int i=0;i<100000;i++){
            System.out.println(Thread.currentThread().getName()+" : "+counter++);
        }
    }
}

public class MyController {
    public static void main(String[] args) throws InterruptedException {
        Runnable r1=new MyThread();
        Runnable r2=new MyThread();
        Runnable r3=new MyThread();
        Runnable r4=new MyThread();
        Thread t1;
        Thread t2;
        Thread t3;
        Thread t4;
        t1=new Thread(r1,"Thread 1");
        t2=new Thread(r2,"Thread 2");
        t3=new Thread(r3,"Thread 3");
        t4=new Thread(r4,"Thread 4");

        t2.start();
        t1.start();
        t3.start();
        t4.start();
    }
}
Run Code Online (Sandbox Code Playgroud)

Erw*_*idt 5

变量是static,但方法synchronized不是static。这意味着它将获取当前实例的监视器,并且每个线程都有不同的当前实例。

一个简单的解决方案是也制作该syncMethod方法;static在这种情况下,它将锁定该类的所有实例共享的监视器MyThread

public static synchronized void syncMethod()
Run Code Online (Sandbox Code Playgroud)