synchronized 块的使用示例。本例模拟一个售楼处的售房活动。若干个售楼人员同时出售楼盘。每一个售楼员的活动可以看作一个线程。待售的楼盘便是各线程需要共享的资源。开始售房之前,需要取得某房的使用权(资源),取不到的情况下等待;开始售房之后,则需要取得对该房的独享控制;售完时,需要通知相关人员该房已售出;或者未售出时,通知他人可以拿到该房的出售权,上机实现,改进为10个人卖100套房
时间: 2024-03-02 18:48:29 浏览: 21
下面是使用 synchronized 块实现的示例代码:
```java
public class Salesman implements Runnable {
private static int totalRooms = 100; // 总共100套房
private static int currentRoom = 1; // 当前正在售卖的房间号
private static Object lock = new Object(); // 锁对象
private String name; // 售楼员姓名
public Salesman(String name) {
this.name = name;
}
@Override
public void run() {
while (true) {
synchronized (lock) {
// 判断是否还有房可售
if (currentRoom > totalRooms) {
System.out.println("所有房间已售完," + name + "停止售房。");
break;
}
// 获取当前售卖的房间号
int room = currentRoom;
// 模拟售房的过程
try {
System.out.println(name + " 正在售卖房间 " + room);
Thread.sleep(1000); // 模拟售房过程中的耗时操作
} catch (InterruptedException e) {
e.printStackTrace();
}
// 该房售出,更新 currentRoom 的值
currentRoom++;
// 通知其他售楼员该房已售出
System.out.println(name + " 售出了房间 " + room);
lock.notifyAll(); // 通知所有等待该房的售楼员
}
}
}
public static void main(String[] args) {
// 创建10个售楼员线程
Thread[] threads = new Thread[10];
for (int i = 0; i < threads.length; i++) {
threads[i] = new Thread(new Salesman("售楼员" + (i + 1)));
threads[i].start();
}
// 等待所有售楼员线程执行完毕
for (Thread thread : threads) {
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("所有售楼员停止售房,销售活动结束。");
}
}
```
在这个示例中,我们使用了一个静态变量 `lock` 作为锁对象,多个售楼员线程在访问共享资源时都需要先获取该锁。对于共享资源 `totalRooms` 和 `currentRoom`,我们使用 synchronized 块来保证线程安全。具体来说:
1. 在进入 synchronized 块之前,每个线程都会判断当前是否还有房可售,若已售完则退出循环。
2. 在 synchronized 块内,线程会获取当前售卖的房间号,并模拟售房的过程,这个过程中可能需要一些耗时的操作。
3. 售房成功后,线程会更新 `currentRoom` 的值,然后使用 `notifyAll()` 方法通知其他等待该房的售楼员线程,这些线程会竞争获取锁来售卖下一套房。如果没有其他线程等待该房,则该 `notifyAll()` 方法不会有任何作用。
4. 售房员线程采用无限循环的方式,直到所有房间售完为止。
5. 在主线程中,我们使用 `join()` 方法等待所有售楼员线程执行完毕,然后输出销售活动结束的提示信息。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)