多线程间通讯实战:Java同步控制实现
121 浏览量
更新于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 上传
2023-07-29 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
weixin_38696176
- 粉丝: 6
- 资源: 919
最新资源
- 10-days-of-statistics:使用Python(numpy)从Hackerrank练习10天的统计信息。 关联
- Comparison-of-Student-Grants-using-VBA:使用VBA的数据透视表和数据透视图报告,用于比较两所大学的助学金。 该代码是美国俄亥俄州辛辛那提大学的专有作品。 这只能用于学术目的。 复制此课程的任何部分均需获得作者的许可
- hwnd-adorner:WPF库支持由HwndHost托管的任何hwnd上的层(修饰)
- revues:解析Cairn.info日记元数据
- 算法:《剑指提供》,《程序员代码面试指南》,Leetcode等算法衔接集合。基于.net core的控制台程序,C#实现,包含每道译文的完整描述,多种解法AC代码,以及解主题算法,所有回归正确直接运行以查看输出结果。常用算法汇总中每个算法同样有测试用例,可运行
- js代码-浅拷贝和深拷贝的实现
- 个人网站ADVC58
- nano-2.1.9.tar.gz
- StyleableToast
- Nasty Armoured Tanks of War-开源
- Eatery
- ReCiter:ReCiter:用于学术机构的企业开源作者歧义消除系统
- shirayuki:最没用的Discord机器人
- nano-2.7.2.tar.gz
- java代码-任意给出一个十进制整数,将十进制整数转换为二进制数。
- image2:与其他图像一起包装图像类型