多线程间通讯实战:Java同步控制实现
129 浏览量
更新于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 上传
2023-09-27 上传
2023-04-26 上传
2023-03-28 上传
2023-05-26 上传
2023-07-20 上传
2023-05-24 上传
2023-09-13 上传
weixin_38696176
- 粉丝: 6
- 资源: 919
最新资源
- C++多态实现机制详解:虚函数与早期绑定
- Java多线程与异常处理详解
- 校园导游系统:无向图实现最短路径探索
- SQL2005彻底删除指南:避免重装失败
- GTD时间管理法:提升效率与组织生活的关键
- Python进制转换全攻略:从10进制到16进制
- 商丘物流业区位优势探究:发展战略与机遇
- C语言实训:简单计算器程序设计
- Oracle SQL命令大全:用户管理、权限操作与查询
- Struts2配置详解与示例
- C#编程规范与最佳实践
- C语言面试常见问题解析
- 超声波测距技术详解:电路与程序设计
- 反激开关电源设计:UC3844与TL431优化稳压
- Cisco路由器配置全攻略
- SQLServer 2005 CTE递归教程:创建员工层级结构