1.对于锁参数对象,只有参数对象是同一个对象时才会锁,不同的对象不会锁;
2.锁当前类对象,所有调用该类对象的情况下都会进行锁操作
总结的不好,可能理解不了,直接看代码和执行结果
锁参数对象: public class TestThread { public static void main(String[] args) { T2 t2 = new T2(); new T(t2,"lxl0").start(); new T(t2,"lxl0").start(); new T(t2,"lxl2").start(); new T(t2,"lxl3").start(); } } class T extends Thread { T2 t2; String userId; public T(T2 t2,String userId){ this.t2 = t2; this.userId = userId; } public void run() { t2.m(userId); } } class T2{ public void m(String userId) { System.out.println("m................"); synchronized (userId) { try { System.out.println("userId:" + userId); Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } } } ----------------------------------------------- 执行结果: m................ userId:lxl0 m................ m................ userId:lxl2 m................ userId:lxl3 userId:lxl0
2.锁类对象
锁类对象: public class TestThread { public static void main(String[] args) { T2 t2 = new T2(); new T(t2,"lxl0").start(); new T(t2,"lxl0").start(); new T(t2,"lxl2").start(); new T(t2,"lxl3").start(); } } class T extends Thread { T2 t2; String userId; public T(T2 t2,String userId){ this.t2 = t2; this.userId = userId; } public void run() { t2.m(userId); } } class T2{ public void m(String userId) { System.out.println("m................"); synchronized (this) { try { System.out.println("userId:" + userId); Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } } } ----------------------------- 执行结果: m................ userId:lxl0 m................ m................ m................ userId:lxl3 userId:lxl2 userId:lxl0