java - 方法同步线程问题

标签 java multithreading synchronized

我似乎无法获得 20000 的最终计数器值。这段代码有什么问题?

public class Synchronize2 {

    public static void main(String[] args) {
        Threading t1 = new Threading();
        Threading t2 = new Threading();

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        System.out.println(Threading.counter);
    }
}


class Threading extends Thread {

    static int counter;

    public synchronized void incrementer() {
        counter++;
    }

    public void run() {
        for (int i=0; i<10000; i++) {
            incrementer();
        }
    }
}

最佳答案

您的同步 incrementer 方法将锁定对象本身。但是您有 2 个不同的对象,每个对象都锁定自己,因此该方法不是线程安全的;两个线程仍然可以同时访问 incrementer

此外,后增量操作不是线程安全的,因为它不是原子的;有读操作和自增操作,两个操作中间可以中断一个线程。此非线程安全代码呈现竞争条件,其中线程一读取值,线程二读取值,然后线程一递增和线程二递增,但只有最后一个递增“获胜”并且一个递增丢失。当结束值小于 20000 时显示。

也使方法静态,因为它是同步的,所以它会锁定类的类对象,这里是适当的同步。

public static synchronized void incrementer() {

关于java - 方法同步线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21049861/

相关文章:

java - Gradle 可以将多个项目打包到一个 jar 中吗?

java - hibernate 4 jta websphere

java - 为什么在泛型类上调用具有泛型返回值的方法被 javac 认为是不安全的?

java - 四舍五入到 2 位数后如何打印 Double?

java - 同步方法以避免死锁

java - Java等待方法的工作原理

多线程与共享内存

c++ - 不同深度图像的TBB-并行卷积

c# - 中止一个线程还是让它被计算机清理?

Java:同步关键字不会阻塞不同线程上的对象