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