多线程间通讯实战:Java同步控制实现
146 浏览量
更新于2024-08-31
收藏 113KB PDF 举报
在面试中,多线程之间的通讯是一个重要的概念,它涉及到多个线程如何协同工作并共享同一资源,尽管每个线程执行的操作不同。这里主要关注的是如何在Java中处理这种并发场景,特别是当两个线程分别负责写入用户信息(如姓名和性别)和读取用户信息时,确保数据的一致性和线程安全。
首先,我们有一个共享资源类`Res`,包含两个属性:`userSex`和`userName`。输入线程`InpThread`继承自`Thread`类,其职责是周期性地改变用户信息。在原始代码中,`InpThread`通过一个无锁循环交替设置`userName`为"小明"和"小红",`userSex`为"男"和"女",这会导致数据错误,因为没有同步机制保证线程安全。
为了确保多线程安全,将`InpThread`的`run()`方法加上`synchronized`关键字,这样每次只有一个线程可以访问`res`对象,避免了数据竞争。这是通过在方法前添加`synchronized(this)`来实现的,确保整个`run()`方法块被锁定,只允许一个实例同时执行。修改后的代码如下:
```java
class InpThread extends Thread {
private Res res;
public InpThread(Res res) {
this.res = res;
}
@Override
synchronized public void run() {
int count = 0;
while (true) {
if (count == 0) {
res.userName = "小明";
res.userSex = "男";
} else {
res.userName = "小红";
res.userSex = "女";
}
count = (count + 1) % 2;
}
}
}
```
输出线程`OutThread`则持续打印`Res`对象中的信息,用于观察同步后的变化。
在`main`方法中创建这两个线程并启动它们:
```java
public static void main(String[] args) {
Res res = new Res();
InpThread inpThread = new InpThread(res);
OutThread outThread = new OutThread(res);
inpThread.start();
outThread.start();
}
```
现在,由于`InpThread`内部是线程安全的,数据更新不会发生错乱,输出线程会按照预期顺序打印出"小明--男"和"小红--女",交替出现。这种实现方式利用了Java的内置线程同步机制,确保了多线程环境下资源的正确共享和线程间的协作。
总结:面试时如果遇到关于多线程之间通讯的问题,应熟悉线程同步的基本概念和实现方法,特别是在共享资源的情况下如何保证线程安全。理解并能够应用`synchronized`关键字或更高级的并发控制机制(如`ReentrantLock`、`Semaphore`等)是关键。此外,对Java并发编程模型和常见并发问题有深入的理解也很重要。
2010-11-13 上传
2019-09-04 上传
2020-09-25 上传
2012-02-03 上传
2023-07-29 上传
2022-03-11 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
weixin_38696176
- 粉丝: 6
- 资源: 919
最新资源
- 前端协作项目:发布猜图游戏功能与待修复事项
- Spring框架REST服务开发实践指南
- ALU课设实现基础与高级运算功能
- 深入了解STK:C++音频信号处理综合工具套件
- 华中科技大学电信学院软件无线电实验资料汇总
- CGSN数据解析与集成验证工具集:Python和Shell脚本
- Java实现的远程视频会议系统开发教程
- Change-OEM: 用Java修改Windows OEM信息与Logo
- cmnd:文本到远程API的桥接平台开发
- 解决BIOS刷写错误28:PRR.exe的应用与效果
- 深度学习对抗攻击库:adversarial_robustness_toolbox 1.10.0
- Win7系统CP2102驱动下载与安装指南
- 深入理解Java中的函数式编程技巧
- GY-906 MLX90614ESF传感器模块温度采集应用资料
- Adversarial Robustness Toolbox 1.15.1 工具包安装教程
- GNU Radio的供应商中立SDR开发包:gr-sdr介绍