java monitor是什么意思_Java synchronized关键字和monitor

最近在看Java并发相关的东西,然后再看文档的时候经常看到monitor这个词,例如Object.wait的文档里有这么一句:

The current thread must own this object's monitor.

因为不清楚这个词是什么意思,所以特地查了一下,记录一下。

当我们在写同步相关的代码,经常会使用到synchronized这个关键字,synchronized方法或者synchronized代码块,例如

public class Account {

private int balance;

// synchronized方法

synchronized public int getBalance() {

return balance;

}

public void setBalance(int balance) {

// synchronized代码块

synchronized (this) {

this.balance = balance;

}

}

}

之所以这个synchronized关键字会起带同步的作用,就是因为monitor。monitor只是一个简称,通常称为intrinsic lock或者monitor lock。

每个对象都有一个monitor lock与之相关联,如果一个线程需要排他和一致访问对象的某个域,它就必须先获得对象的monitor lock,当它完成任务之后再释放这个锁,让其它线程可以访问到。只要一个线程获得了一个monitor lock,那么其它线程就没办法获取到这个锁。也就是说,当其它线程尝试获得锁的时候就会阻塞。

对了,当synchronized的是静态方法,那么获取的monitor lock应该是这个类对应的Class对象的锁,如下所示。在静态方法中,synchronized代码块如果如果想要获取this的锁就会报错,因为静态方法是属于类的,不是属于对象。但是我们可以通过获取Account.class对象的锁来做互斥操作。

class Account {

private static int defaultBalance = 5;

synchronized public static int getDefaultBalance() {

return defaultBalance;

}

public static void setDefaultBalance(int balance) {

synchronized (Account.class) {

defaultBalance = balance;

}

}

}

synchronized方法获取的是当前对象的锁,而对于synchronized代码块,可以使用通过获取其它对象的锁来做同步,如下代码中,setBalance方法里,就是通过获取lock对象的锁来做互斥操作。

class Account {

private int balance;

private final Object lock = new Object();

public void setBalance(int balance) {

// 获取lock对象的锁

synchronized (lock) {

this.balance = balance;

}

}

synchronized public int getBalance() {

return balance;

}

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值