1)使用synchronized,本质上是针对某个“对象”进行加锁。
2)加锁操作就是给对象里面的对象头进行标志位设置。
3)用法
1. 直接修饰普通方法
public class SynchronizedDemo { public synchronized void methond() { } }
2. 修饰一个代码块
public class SynchronizedDemo {
public void method() {
synchronized (锁对象) {//若针对某个代码块进行加锁,需要指定针对哪个对象进行加锁。
}
}
}
3. 修饰一个静态方法
public class SynchronizedDemo { public synchronized static void methond() { } }
可以等价为:
public class SynchronizedDemo {
public static void method() {
synchronized (SynchronizedDemo.class) {//针对类对象进行加锁
}
}
}
类对象:类名.class (在运行程序的时候,.class文件加载到JVM的模样)
4) 特性
1. 互斥性
在针对同一对象时,加锁-解锁过程中只有一个线程执行,其他针对该对象的线程进入阻塞状态;
2. 刷新内存
3. 可重入
同一个线程针对同一个锁,连续加锁两次,如果出现死锁,就是不可重入,如果不会死锁,就是可重入;synchronized : 实现可重入锁,不必担心发生死锁现象;
死锁:
进入方法,外层加锁,内层则无法加锁,方法无法继续执行,要想使外层解锁,又必须要方法执行完毕;
public class Demo04 {
public synchronized void method(){
synchronized (this){//多次加锁无实质影响
}
}
}