【问题标题】:why Synchronized method allowing multiple thread to run concurrently?为什么同步方法允许多个线程同时运行?
【发布时间】:2011-10-05 10:01:33
【问题描述】:

我在同一个文件中有以下程序。我已经同步了 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

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

【问题讨论】:

  • 您发布的代码至少有一个语法错误,而且很难按原样阅读。确保您发布您的实际代码并尝试将其格式化。
  • 误解是您正在锁定一个方法,而不是您有一个锁定实例的方法。

标签: java multithreading synchronized


【解决方案1】:

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

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

如果您确实想防止这种情况发生,您可以在 run() 内有一个 synchronized(obj) 块,其中 obj 将是您的类的两个实例共享的某个对象:

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

【讨论】:

  • 如果我们只有一个类实例和多个线程,是否可以同时运行一些synchronized方法?
  • @ssss:当然:static 与非static,使用具有不同锁的synchronized 块等。如果您需要更多信息,请发布一个新问题。
猜你喜欢
  • 1970-01-01
  • 2014-09-19
  • 2017-10-23
  • 2019-02-05
  • 1970-01-01
  • 2023-02-10
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多