java - 为什么同步方法允许多个线程并发运行?

标签 java multithreading synchronized

我在同一文件中有以下程序。我已经同步了 run() 方法。

class MyThread2 implements Runnable {
    Thread    t;

    MyThread2(String s) {
        t=new Thread(this,s);
        t.start();
    } 

    public synchronized  void  run() {
        for (int i=0;i<3;i++) {
            System.out.println("Thread name : "+ Thread.currentThread).getName());
            try {
                t.sleep(1000);
            }
            catch (InterruptedException e) {
                e.getMessage();
            }
        }
    }
}

class TestSync {
    public static void main(String[] args) {
        MyThread2 m1=new MyThread2("My Thread 1");
        c.fun();
    }
}

class c {
    static void fun() {
        MyThread2 m1=new MyThread2("My Thread 4");
    }
}

输出是

Thread name : My Thread 1
Thread name : My Thread 4
Thread name : My Thread 4
Thread name : My Thread 1
Thread name : My Thread 1
Thread name : My Thread 4

我的问题是为什么同步方法允许同时访问“我的线程 1”和“我的线程 4”线程?

最佳答案

synchronized 方法在实例级别工作。类的每个实例都有自己的锁。每次进入实例的任何 synchronized 方法时都会获取锁。这可以防止多个线程调用 synchronized 方法在同一个实例上(注意这也可以防止不同 synchronized 方法获取在同一实例上调用)。

现在,由于您有两个类实例,每个实例都有自己的锁。没有什么可以阻止两个线程同时对自己的实例进行操作。

如果你确实想阻止这种情况,你可以在 run() 中有一个 synchronized(obj) block ,其中 obj 是类的两个实例共享的一些对象:

class MyThread2 implements Runnable {
   private static final Object lock = new Object();
   ...
   public void run() {
     synchronized(lock) {
       ...
     }
   }
}

关于java - 为什么同步方法允许多个线程并发运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7659615/

相关文章:

java - 如何安全地停止从警报对话框启动的线程?

java - 如何避免交替同步线程上的竞争条件?

java - 如何在jtextarea中显示for循环的结果? java

java - Ivy :强制本地快照依赖

java - 无法创建池的初始连接,无法获取 JDBC 连接错误

c - 多线程程序中段错误的原因

multithreading - 乐观并发控制澄清

android - 安卓游戏可以同步触摸事件和更新吗?

java - 同步会影响对象成员吗?

java - JScrollPane 在调整大小时消失