多线程在run()方法上加同步无法保证线程同步

问题描述

  1. 使用继承Thread方法创建线程实例
  2. 重写run()方法的时候,用synchronized关键字修饰run()方法
  3. 结果是线程之间不是同步进行,计算结果出现问题

代码片段

public class MyThreadDemo9 extends Thread{
    private static int count = 0;
    public String status;
    public MyThreadDemo9(String status){
        this.status = status;
    }
    @Override
    public synchronized void run() {
        for(int i = 0; i < 100; i++) {
            count++;
        }
    }
    public static void main(String[] args) throws InterruptedException {
        for(int i = 0; i < 100; i++) {
            MyThreadDemo9 m8 = new MyThreadDemo9("Thread status - " + i);
            m8.start();
        }
        Thread.sleep(3000);
        System.out.println(MyThreadDemo9.count);
    }
}

这个是什么原因呢,不能使用 synchronized 关键字修饰run()方法吗

阅读 4.3k
3 个回答

大声告诉我:synchronized的作用对象是什么?!

你这里加锁的是每个线程对象本身,其实并没有并发控制。这里用AtomicInteger就可以实现线程安全的增加

你锁定的是对象,但是这里的共享变量属于类。。。并不是属于对象本身,你应该锁定类才行。。。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题