主要对Java 8 常用的锁如何使用进行分享
一、synchronized
(一)、用法:
1.synchronized可以用在方法(包含静态方法),
2.synchronized块
void increment() {
synchronized (this) {
count += 1;
}
}
(二)、原理:
关键词:monitor
1.synchronized修饰方法
synchronized void increment() {
count += 1;
}
反编译后会在方法的flag上带ACC_SYNCHRONIZED标记,当方法调用时,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先获取monitor,获取成功之后才能执行方法体,方法执行完后再释放monitor。在方法执行期间,其他任何线程都无法再获得同一个monitor对象.
2.synchronized修饰对象
void increment() {
synchronized (this) {
count += 1;
}
}
反编译结果:
...
monitorenter
方法内逻辑(count += 1;)
monitorexit
...
monitorenter:
每个对象有一个monitor,当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的所有权,过程