多线程间通讯实战:Java同步控制实现

0 下载量 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并发编程模型和常见并发问题有深入的理解也很重要。