1)概述
synchronized 即俗称的对象锁,采用互斥的方式保证同一时段只有一个对象可以获取锁,其他对象想获取锁只能等待锁释放。实际上是保证了临界区中代码的原子性。
synchronized块是Java提供的一种原子性内部锁(监视器锁),当一个线程进入该同步块之前会先获取到内部锁,之后其他线程如果想进入该同步块则会被挂起,这也说明它是一个独占锁(悲观锁),只允许同时有一个在操作,其他必须等待。
2)添加位置
class SynTest1{
// 1)加在成员方法上
public synchronized void doSomething() {
.....
}
// 等价于 代码块持有this对象锁
public void doSomething() {
synchronized(this) {
.....
}
}
}
class SynTest2{
// 2)加在静态方法上
public synchronized static void doSomething() {
.....
}
// 等价于 代码块持有类的Class对象锁
public void doSomething() {
synchronized(SynTest2.class) {
.....
}
}
}
3)意义
synchronized的内存语义可以用来解决内存可见性问题:进入同步块时把同步块中的用到的变量从线程工作内存中清除,转而从主内存中获取;退出同步块时将更改写入到主内存中。这就不会出现内存的可见性问题,因为所有的操作都是针对主内存做的。加锁释放锁的语义也是如此。