java 内在锁,java 内在锁(intrinsic lock)或者监视器锁(monitor lock)

1. 同步方法中的锁

当线程调用同步方法时,它自动获得这个方法所在对象的内在锁,并且方法返回时释放锁,如果发生未捕获的异常,也会释放锁。

当调用静态同步方法时,因为静态方法和类相关联,线程获得和这个类关联的Class对象的内在锁。

使用内在锁后,把deposit方法和withdraw方法修改为同步方法,就可以避免线程干扰。

public synchronized void deposit(int amount) {

balance = balance + amount;

}

public synchronized void withdraw(int amount) {

balance = balance – amount;

}

2. 同步语句

同步语句必须指定提供内在锁的对象,其基本用法如下:

synchronized(提供锁的对象){

临界代码

}

用同步语句修改BankAccount类中的方法如下:

public void deposit(int amount) {

synchronized (this) {

balance = balance + amount;

}

}

public void withdraw(int amount) {

synchronized (this) {

balance = balance – amount;

}

}

3. 同步类

把synchronized关键字放在类的前面,这个类中的所有方法都是同步方法。

4. 可重入同步

线程可以获得他已经拥有的锁,运行线程多次获得同一个锁,就是可以重入(reentrant)同步。这种情况通常是同步代码直接或者间接的调用也包含了同步代码的方法,并且两个代码集都使用同一个锁。如果没有可重入同步,那么,同步代码就必须采取很多额外的预防措施避免线程阻塞自己。java java.util.concurrent 包中的  ReentrantLock 即为可重入锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值