[javaSE] 并发编程(线程间通信)
新建一个资源类Resource
定义成员变量String name
定义成员变量int age
新建一个输入类Input,实现Runnable接口
定义一个构造方法Input(),传入参数:Resource对象
实现run()方法
定义while(true)往Resuorce对象的属性赋值
新建一个输出类Output,实现Runnable接口
定义一个构造方法Output(),传入参数:Resource对象
实现run()方法
定义while(true)打印Resuorce对象的属性
main方法中
获取Resource对象,new出来
获取Input对象,new出来,构造参数:Resource对象
获取Output对象,new出来,构造参数:Resource对象
获取Thread对象,new出来,构造参数:Runnable对象
调用Thread对象的start()方法,开启线程
此时会有线程安全问题,查看结果可以发现,汉字和拼音的混了
陶士涵=====男
taoshihan=====nan
陶士涵=====nan
陶士涵=====nan
陶士涵=====男
陶士涵=====男
陶士涵=====nan
陶士涵=====nan
taoshihan=====nan
taoshihan=====nan
使用synchronized(){}同步代码块包裹操作同一个资源的地方
注意同步线程的个数,所有的线程都应该加上
注意是否是同一个锁,synchronized()括号内的锁参数:保证是个唯一的资源
使用synchronized(){}包裹上面的赋值和打印,锁:Resource对象(唯一的)
查看结果,此时没有安全问题
陶士涵=====男
陶士涵=====男
陶士涵=====男
taoshihan=====nan
taoshihan=====nan
taoshihan=====nan
死锁问题:同步中嵌套同步,并且锁不一致,此时会造成死锁问题
/** * 资源 * * @author taoshihan * */ class Resource { String name; String sex; } /** * 输入 * * @author taoshihan * */ class Input implements Runnable { private Resource resource; public Input(Resource resource) { this.resource = resource; } @Override public void run() { // 切换 boolean flag = true; while (true) { synchronized (resource) { if (flag) { resource.name = "taoshihan"; resource.sex = "nan"; } else { resource.name = "陶士涵"; resource.sex = "男"; } flag = !flag; } } } } /** * 输出 * * @author taoshihan * */ class Output implements Runnable { private Resource resource; public Output(Resource resource) { this.resource = resource; } @Override public void run() { while (true) { synchronized (resource) { System.out.println(resource.name + "=====" + resource.sex); } } } } public class InputOutputDemo { /** * @param args */ public static void main(String[] args) { Resource resource = new Resource(); Input input = new Input(resource); Output output = new Output(resource); Thread t1 = new Thread(input); Thread t2 = new Thread(output); t1.start(); t2.start(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具