1)概述

synchronized 即俗称的对象锁,采用互斥的方式保证同一时段只有一个对象可以获取锁,其他对象想获取锁只能等待锁释放。实际上是保证了临界区中代码的原子性。
synchronized块是Java提供的一种原子性内部锁(监视器锁),当一个线程进入该同步块之前会先获取到内部锁,之后其他线程如果想进入该同步块则会被挂起,这也说明它是一个独占锁(悲观锁),只允许同时有一个在操作,其他必须等待。

2)添加位置

  1. class SynTest1{
  2. // 1)加在成员方法上
  3. public synchronized void doSomething() {
  4. .....
  5. }
  6. // 等价于 代码块持有this对象锁
  7. public void doSomething() {
  8. synchronized(this) {
  9. .....
  10. }
  11. }
  12. }
  1. class SynTest2{
  2. // 2)加在静态方法上
  3. public synchronized static void doSomething() {
  4. .....
  5. }
  6. // 等价于 代码块持有类的Class对象锁
  7. public void doSomething() {
  8. synchronized(SynTest2.class) {
  9. .....
  10. }
  11. }
  12. }

3)意义

synchronized的内存语义可以用来解决内存可见性问题:进入同步块时把同步块中的用到的变量从线程工作内存中清除,转而从主内存中获取;退出同步块时将更改写入到主内存中。这就不会出现内存的可见性问题,因为所有的操作都是针对主内存做的。加锁释放锁的语义也是如此。