新建一个资源类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;} * 输入 * * class input implements Runnable { private Resource resource; public input(Resource resource) { this.resource = resource; } @OverrIDe public voID run() { // 切换 boolean flag = true; while () { synchronized (resource) { if (flag) { resource.name = "taoshihan"; resource.sex = "nan"; } else { resource.name = "陶士涵"; resource.sex = "男"; } flag = !flag; } } }} * 输出 * * class Output Output(Resource resource) { (resource) { System.out.println(resource.name + "=====" + resource.sex); } } }} inputOutputDemo { * @param args */ static main(String[] args) { Resource resource = new Resource(); input input = input(resource); Output output = Output(resource); Thread t1 = Thread(input); Thread t2 = Thread(output); t1.start(); t2.start(); }}
总结
以上是内存溢出为你收集整理的[javaSE] 并发编程(线程间通信)全部内容,希望文章能够帮你解决[javaSE] 并发编程(线程间通信)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)