使用Synchronized (this) 对当前对象进行同步化,这很容易理解;但对其他对象同步化,应该怎样理解?比如下面的代码,synchronized(syncObject) 语句,syncObject 就是一个普通对象Object,这样又有什么意义了?import static net.mindview.util.Print.*;class DualSynch { private Object syncObject = new Object(); public synchronized void f() { for(int i = 0; i < 5; i++) { print("f()"); Thread.yield(); } } public void g() { synchronized(syncObject) { for(int i = 0; i < 5; i++) { print("g()"); Thread.yield(); } } }}public class SyncObject { public static void main(String[] args) { final DualSynch ds = new DualSynch(); new Thread() { public void run() { ds.f(); } }.start(); ds.g(); }}
5 回答
慕后森
TA贡献1802条经验 获得超5个赞
我的理解是 Java 中每个对象都有一把锁,synchronized (this) 锁的是对象本身,synchronized (object) 锁的是一个作为锁的 Object。
以下代码中的两个 synchronized 块之间不构成同步,因为两个块的锁加在了不同对象上
class SyncSample {
Object lock = new Object();
synchronized void m1() {
System.out.println("m1");
}
void m2() {
synchronized (lock) {
System.out.println("m2");
}
}
}
梦里花落0921
TA贡献1772条经验 获得超6个赞
拉莫斯之舞
TA贡献1820条经验 获得超10个赞
public synchronized void f()
相当于synchronized (this)
也就是对象本身,synchronized(syncObject)
加锁的是另外一个对象syncObject。
这样的结果就是:你new出来一个DualSynch
对象,在两个线程中f()
方法和g()
方法是可以并发执行的,但是在两个线程中f()
和f()
不能并发执行,g()
和g()
不能并发执行。
添加回答
举报
0/150
提交
取消