Java 线程 - 同步(this)

标签 java multithreading synchronized

请参阅下面的程序

public class TestVolatile implements Runnable {

    public static volatile int counter;
    public static String lock = "lock";

    public static void main(String[] args) {
        Thread t1 = new Thread(new TestVolatile(),"Thread-1");
        Thread t2 = new Thread(new TestVolatile(),"Thread-2");
        t1.start();
        t2.start();
    }

    public void run() {
        synchronized(this) {
            System.out.println(Thread.currentThread()+"-"+counter);
            counter++;
        }
    }
}

如果我多次运行这个程序,我会得到 3 个不同的结果。

首先是

Thread[Thread-1,5,main]-0
Thread[Thread-2,5,main]-0

第二个是

Thread[Thread-1,5,main]-0
Thread[Thread-2,5,main]-1

第三个是

Thread[Thread-1,5,main]-1
Thread[Thread-2,5,main]-0

但是如果将锁定对象从“this”更改为“lock”,我会得到两个不同的结果

首先是

Thread[Thread-1,5,main]-0
Thread[Thread-2,5,main]-1

第二个是

Thread[Thread-1,5,main]-1
Thread[Thread-2,5,main]-0

我在编写程序时的假设是,无论哪种情况,两个语句中的“计数器”都不应该为 0。
有人可以解释一下吗?

最佳答案

您创建两个 TestVolatile 对象。 “this”关键字指的是线程中运行的 TestVolatile 对象。因此,在第一个示例中,您不会在同一个对象上进行同步。

如果您像这样更改代码,那么第一个示例将开始工作:

public static void main(String[] args) {
    TestVolatile testVolatile = new TestVolatile();
    Thread t1 = new Thread(testVolatile,"Thread-1");
    Thread t2 = new Thread(testVolatile,"Thread-2");
    t1.start();
    t2.start();
}

关于Java 线程 - 同步(this),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10328154/

相关文章:

java - 在 Java 中创建二维数组的语法

java - 绕 x 轴翻转一维阵列板表示

java - 如何在Spring@RestController中映射多个bean?

Java:如何显示Hello World!单击按钮后

c - 向 pthread_create() 发送多个参数

java - wait后线程恢复(if-else的作用)

multithreading - 使用类成员函数时std::thread构造函数按引用传递

java - 在 spring boot Rest API 中关闭 ExecutorService

java - 为什么来自 'Concurrency in practice' 的 CooperatingNoDeadlock 使用与同一监视器的双同步?

java - 基本类型是易变的还是同步的?