Synchronized详解
Synchronized是内置锁,锁的是对象,
Synchronized 有几个使用方式,但其实都是作用于对象。
- 1、作用于方法块
- 2、作用于obj
- 3、作用于this
- 4、作用于class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public synchronized void lockFun() { try { Thread.sleep(10); System.out.println("当前线程Name: " + Thread.currentThread().getName()); Thread.sleep(10); System.out.println("当前线程Name: " + Thread.currentThread().getName() + "结束"); } catch (InterruptedException e) { e.printStackTrace(); } }
public void lockThis() { synchronized (this) { try { Thread.sleep(10); System.out.println("当前线程Name: " + Thread.currentThread().getName()); Thread.sleep(10); System.out.println("当前线程Name: " + Thread.currentThread().getName() + "结束"); } catch (InterruptedException e) { e.printStackTrace(); } } }
|
上面的示例代码中,lockFun是作用于方法块,lockThis是作用于this,但实际上这两个函数都是作用于当前的类的实例对象上的
1 2 3 4 5 6 7 8 9
| public void lockClass() { synchronized (Test.class) { } }
public static synchronized void lockStatic() { }
|
而在lockClass与lockStatic中,lockStatic作用与static静态函数,lockClass作用与Test.class对象,但实际都是作用与Test的所有实例对象
1 2 3 4 5
| public void lockObj(Object o) { synchronized (o){ } }
|
lockObj就是直接作用于Object对象。