Synchronized标记的代码必须给顶一个其上进行同步的对象,并且最合理的方式是,使用其方法正在调用的对象Synchronized(this)这是最常用的方式了,在这种方式中 如果获得了Synchronized块上的锁,那么该对象其他的Synchronized方法和临界区就不能调用了。所以有时候需要我们在另一个对象上同步,然后我们必须保证所有相关的任务都是在同一个对象上同步的,然后写了一个实例 演示两个人物可以同时进入一个对象,只要这个对象上的方法是在不同的锁上同步即可
package test.thread.sx.other; public class DualSynch { private Object syncObject = new Object(); public synchronized void f(){ for(int i=0;i<5;i++){ System.out.println("f()"); Thread.yield(); } } public void g(){ synchronized (syncObject) { for(int i=0;i<5;i++){ System.out.println("g()"); Thread.yield(); } } } package test.thread.sx.other; public class SyncObject { public static void main(String[] args) { // TODO Auto-generated method stub final DualSynch ds = new DualSynch(); new Thread(){ public void run(){ ds.f(); } }.start(); ds.g(); } }
结果是 互相不影响 线程不会发生锁定
g()
f()
g()
g()
g()
g()
f()
f()
f()
f()