目录
一、内置锁与互斥锁
- 一、内置锁与互斥锁
- 二、Synchronized修饰普通方法
- 三、Synchronized修饰静态方法
- 四、Synchronized修饰代码块
- 内置锁:每个java对象都可以用做一个实现同步的锁,这些锁被称为内置锁(Intrinsic)或监视锁(Monitor Lock)。线程在进入同步代码块之前会自动获得锁,并且在退出同步代码块时自动释放锁。
- 互斥锁:java的内置锁相当于一种互斥体(或互斥锁),这意味着最多只有一个线程能持有这种锁。
1、代码
public class Test {
private int value;
/**
* synchronized 修饰普通方法时,内置锁就是当前类的实例
* @return
*/
public synchronized int getValue(){
return value++;
}
}
2、结论:
- synchronized 修饰普通方法时,内置锁就是当前类的实例
1、代码
public class Test1 {
private static int value;
/**
* synchronized 修饰静态方法时,内置锁是当前的Class字节码对象
* @return
*/
public static synchronized int getValue(){
return value--;
}
}
2、结论:
- synchronized 修饰静态方法时,内置锁是当前的Class字节码对象
-
在某些情况下,我们编写的方法体可能比较大,同时存在一些比较耗时的操作,而需要同步的代码又只有一小部分,如果直接对整个方法进行同步操作,可能会得不偿失,此时我们可以使用同步代码块的方法对需要同步的代码进行包裹,这样就无需对整个方法进行同步操作了。
-
我们可以使用如下几种对象来作为锁的对象: 1、成员锁(锁的对象是变量)
public class Test2 { public Object getValue(Object obj){ synchronized (obj){ //操作 } } }
2、实例对象锁
public class Test3 { synchronized(this) { //操作 } }
3、当前类的 class 对象锁
public class Test4 { synchronized(Test4.class) { //操作 } }