synchronized获取的锁是对象,而不是函数或语句块。
项目结构
资源类
import java.util.concurrent.TimeUnit; public class myResource { public void x(){ System.out.println(Thread.currentThread().getName()+" :等待进入 synchronized in x方法"); synchronized (this) { for(int i = 0;i<10;i++){ System.out.println(Thread.currentThread().getName()+" : synchronized in x方法"); try { TimeUnit.MILLISECONDS.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } } } } public void y(){ System.out.println(Thread.currentThread().getName()+" :等待进入 synchronized in y方法"); synchronized (this) { for(int i = 0;i<10;i++){ System.out.println(Thread.currentThread().getName()+" : synchronized in y方法"); try { TimeUnit.MILLISECONDS.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } } } } public void z(){ System.out.println(Thread.currentThread().getName()+" :等待进入 synchronized in z方法"); synchronized (this) { for(int i = 0;i<10;i++){ System.out.println(Thread.currentThread().getName()+" : synchronized in z方法"); try { TimeUnit.MILLISECONDS.sleep(300); } catch (InterruptedException e) { e.printStackTrace(); } } } } }
运行类
public class Test { public static void main(String[] args) { myResource resource = new myResource(); // 线程0 new Thread(){ public void run() { resource.x(); }; }.start(); // 线程1 new Thread(){ public void run() { resource.y(); }; }.start(); // 线程main resource.z(); } }
运行结果
Thread-0 :等待进入 synchronized in x方法 Thread-0 : synchronized in x方法 Thread-1 :等待进入 synchronized in y方法 main :等待进入 synchronized in z方法 Thread-0 : synchronized in x方法 Thread-0 : synchronized in x方法 Thread-0 : synchronized in x方法 Thread-0 : synchronized in x方法 Thread-0 : synchronized in x方法 Thread-0 : synchronized in x方法 Thread-0 : synchronized in x方法 Thread-0 : synchronized in x方法 Thread-0 : synchronized in x方法 main : synchronized in z方法 main : synchronized in z方法 main : synchronized in z方法 main : synchronized in z方法 main : synchronized in z方法 main : synchronized in z方法 main : synchronized in z方法 main : synchronized in z方法 main : synchronized in z方法 main : synchronized in z方法 Thread-1 : synchronized in y方法 Thread-1 : synchronized in y方法 Thread-1 : synchronized in y方法 Thread-1 : synchronized in y方法 Thread-1 : synchronized in y方法 Thread-1 : synchronized in y方法 Thread-1 : synchronized in y方法 Thread-1 : synchronized in y方法 Thread-1 : synchronized in y方法 Thread-1 : synchronized in y方法