admin 管理员组

文章数量: 1184232


2024年3月21日发(作者:zblog模板工具)

java 对象锁的用法

在Java中,对象锁是通过synchronized关键字来实现的。对象

锁用于保护对象的共享资源,确保在同一时间只有一个线程可以访问

这些资源。当一个线程尝试获取对象锁时,如果锁已经被其他线程获

取,那么该线程将被阻塞,直到锁被释放。

要使用对象锁,可以有两种方式:

1.声明一个方法为synchronized。在方法声明中使用

synchronized关键字,这样的方法就会成为对象锁,只能被一个线程

访问。

```java

public synchronized void method() {

//该方法的代码在同一时间只能被一个线程执行

}

```

2.使用synchronized块。在需要保护的代码块上使用

synchronized关键字,将需要保护的对象作为锁。

```java

public void method() {

synchronized (lockObject) {

//在这个代码块中,只能有一个线程访问lockObject对象

}

}

```

需要注意的是,对象锁只对同一个对象有效。例如,如果有多个

对象实例,每个对象实例都有自己的锁,此时一个线程在一个对象实

例上获取了锁,并不会影响其他对象实例的访问。

当然,除了使用synchronized关键字之外,还有其他方式来实现

对象锁,例如使用Lock接口及其实现类来进行显式锁定。这种方式相

比synchronized关键字更加灵活,可以支持更多的高级功能,例如可

重入锁、公平锁等。

另外,对象锁不仅可以用于保护共享资源,还可以用于确保线程

间的有序执行。例如,在多线程环境下,一个线程需要等待另一个线

程完成某个操作之后才能继续执行,可以使用对象锁来实现。

```java

public class Example {

private boolean flag = false;

public void waitForFlag() throws InterruptedException {

synchronized (this) {

while (!flag) {

wait(); //当前线程等待,直到被其他线程唤醒

}

}

//执行需要在flag为true时才能执行的操作

}

public void setFlag() {

synchronized (this) {

flag = true;

notifyAll(); //唤醒所有在等待的线程

}

}

}

```

以上示例中,线程1在waitForFlag()方法中等待flag变为true,

而线程2在setFlag()方法中会将flag设置为true并唤醒线程1。

这样就可以实现线程1在线程2完成操作后再继续执行的效果。

总结一下,对象锁的用法是通过synchronized关键字来实现,可

以用于保护共享资源和线程之间的有序执行。除了synchronized关键

字,还可以使用Lock接口实现更高级的锁功能。


本文标签: 对象 线程 实现 使用 执行