synchronized 中在加一个 synchronized会发生什么
时间: 2023-12-07 13:05:33 浏览: 25
当在一个 synchronized 块内部再嵌套一个 synchronized 块时,会创建一个新的锁对象。这意味着两个 synchronized 块之间不会发生互斥,它们可以同时执行。但是,如果两个 synchronized 块尝试锁定相同的对象,那么它们仍然是互斥的,因为它们会争夺同一个锁。因此,是否发生互斥取决于所使用的锁对象。
相关问题
private static final WebContext INSTANCE = new WebContext(); 加一个线程安全锁
可以通过在getInstance()方法中加入synchronized关键字来保证线程安全,如下所示:
```
private static volatile WebContext INSTANCE = null;
private WebContext() {}
public static synchronized WebContext getInstance() {
if (INSTANCE == null) {
synchronized (WebContext.class) {
if (INSTANCE == null) {
INSTANCE = new WebContext();
}
}
}
return INSTANCE;
}
```
这里使用了双重检查锁定的机制,即在判断INSTANCE是否为空的if语句之前和之后都使用了synchronized关键字进行同步,确保只有一个线程能够进入临界区创建实例。同时,使用volatile关键字修饰INSTANCE变量,保证在多线程环境下的可见性和有序性。
.编写一个程序,实现JDK中ReadWritelLock的能 ReadWriteLock读写锁: 卖锁中的代码执行时,写锁中的代码被阻塞,写锁中的代码执有时,遗锁中的代他会但是读锁中的代码执行时,其他加读锁的代码不会受影响.
好的,以下是一个简单的 Java 代码实现 ReadWriteLock 读写锁:
```java
public class ReadWriteLock {
private int readers = 0;
private int writers = 0;
private int writeRequests = 0;
public synchronized void lockRead() throws InterruptedException {
while (writers > 0 || writeRequests > 0) {
wait();
}
readers++;
}
public synchronized void unlockRead() {
readers--;
notifyAll();
}
public synchronized void lockWrite() throws InterruptedException {
writeRequests++;
while (readers > 0 || writers > 0) {
wait();
}
writeRequests--;
writers++;
}
public synchronized void unlockWrite() {
writers--;
notifyAll();
}
}
```
在这个实现中,我们使用了几个变量来跟踪读写锁的状态:
- `readers`:当前持有读锁的线程数。
- `writers`:当前持有写锁的线程数。
- `writeRequests`:当前等待获取写锁的线程数。
在 `lockRead` 方法中,如果有线程持有写锁或者有线程在等待获取写锁,我们会让当前线程等待,直到可以获取读锁为止。如果可以获取读锁,我们将 `readers` 计数器加一。
在 `unlockRead` 方法中,我们将 `readers` 计数器减一,并且唤醒所有等待的线程。
在 `lockWrite` 方法中,我们将 `writeRequests` 计数器加一,然后检查是否有线程持有读锁或者写锁。如果有,我们会让当前线程等待,直到可以获取写锁为止。如果可以获取写锁,我们将 `writeRequests` 计数器减一,并且将 `writers` 计数器加一。
在 `unlockWrite` 方法中,我们将 `writers` 计数器减一,并且唤醒所有等待的线程。
这样,我们就实现了一个简单的 ReadWriteLock 读写锁。在读锁中,多个线程可以并发读取共享资源,而在写锁中,只有一个线程可以写入共享资源,其他线程会被阻塞。