首页 > 解决方案 > Java 线程对象锁

问题描述

根据我的理解,每个对象都有一个可以被当前线程持有的锁。

所以,基于这个例子:

public class T1 {
    private final Object o = new Object();

    public  void m1() {
        synchronized(o) {
            //...wait some time
        }
    }
}

如果我创建类似的东西:

    T1 subject1 = new T1();
    T1 subject2 = new T1();
    Runnable r1 = new Runnable() {
        @Override
        public void run() {
            subject1.m1();
            subject2.m1();  
        }
    };

Thread t1 = new Thread(r1);
t1.start();

将有两个锁,subject1.o并且subject2.o(我测试它们是不同的实例),这意味着这两种方法将独立运行,同时,在我的示例中,一个被执行,然后,在它释放锁之后,下一个运行虽然subject1 和 subject2 是具有不同锁的不同实例。

为什么?

标签: javamultithreading

解决方案


在您的示例中,您在同一线程中按顺序运行这两种方法。要并行执行它们,您必须在单独的线程中运行它们。

T1 subject1 = new T1();
T1 subject2 = new T1();
Runnable r1 = new Runnable() {
    @Override
    public void run() {
        subject2.m1();  
    }
};
Runnable r2 = new Runnable() {
    @Override
    public void run() {
        subject2.m1();  
    }
};

Thread t1 = new Thread(r1);
Thread t2 = new Thread(r2);
t1.start();
t2.start();

推荐阅读