多线程同步问题-练习题3-笔记整理
来源:互联网 发布:爱易编程工具箱 编辑:程序博客网 时间:2024/06/12 21:52
练习题3:
程序同时启用了4个线程去调用TestDo.doSome()方法,由于TestDo.doSome方法内部的代码是先暂停1秒,
然后在输出以秒为单位的当前时间值,所以,会打印出4个相同的时间值,如下所示:
4:4:1258199615
1:1:1258199615
3:3:1258199615
1:1:1258199615
修改代码,如果有几个线程调用TestDo.doSome方法时,传递进去的key相等,则这几个线程应互斥排队输出结果,
即当有有个线程的key都是“1”时,他们中的一个要比其他线程晚1秒输出结果。
提示:对key相同的线程处理时,使用同一把锁,阻塞
题目代码示例:
public class Test3 extends Thread{private TestDo1 testDo;private String key;private String value;public Test3(String key1,String key2, String value) {this.testDo = TestDo1.getInstance();this.key = key1+key2;this.value = value;}public static void main(String[] args) {Test3 a=new Test3("1","","1");Test3 b=new Test3("2","","2");Test3 c=new Test3("3","","3");Test3 d=new Test3("4","","4");System.out.println("begin:"+System.currentTimeMillis()/1000);a.start();b.start();c.start();d.start();}public void run(){testDo.doSome(key, value);}}class TestDo1{private TestDo1(){}private static TestDo1 _instance=null;public static TestDo1 getInstance(){if(_instance==null){synchronized (TestDo1.class) {if(_instance==null){ _instance=new TestDo1();}}}return _instance;}public static void doSome(Object key,String value){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(key+":"+value+":"+System.currentTimeMillis()/1000);}}
修改后代码示例:
public class Test3_1 extends Thread{private TestDo1 testDo;private String key;private String value;public Test3_1(String key1,String key2, String value) {this.testDo = TestDo1.getInstance();this.key = key1+key2;this.value = value;}public static void main(String[] args) {Test3_1 a=new Test3_1("1","","1");Test3_1 b=new Test3_1("2","","2");Test3_1 c=new Test3_1("3","","3");Test3_1 d=new Test3_1("1","","1");System.out.println("begin:"+System.currentTimeMillis()/1000);a.start();b.start();c.start();d.start();}public void run(){testDo.doSome(key, value);}}class TestDo1{private TestDo1(){}private static TestDo1 _instance=null;public static TestDo1 getInstance(){if(_instance==null){synchronized (TestDo1.class) {if(_instance==null){ _instance=new TestDo1();}}}return _instance;}ArrayList<String> list=new ArrayList<String>();public void doSome(Object key,String value){String str=(String)key; //关键点,维护key相同,使用相同的锁阻塞if(list.contains(key)){Iterator iterator = list.iterator();while(iterator.hasNext()){String tmp = (String)iterator.next();if(tmp.equals(key)){str=tmp;}}}else{list.add((String)key);}synchronized (str) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(key+":"+value+":"+System.currentTimeMillis()/1000);}}}
0 0
- 多线程同步问题-练习题3-笔记整理
- 多线程同步问题-练习题1-笔记整理
- 多线程同步问题-练习题2-笔记整理
- 多线程学习笔记3:线程同步
- 多线程 同步笔记
- python学习笔记——多线程同步问题
- Java Web笔记 – Servlet多线程同步问题及其解决方法
- python学习笔记——多线程同步问题
- MFC多线程同步问题
- 多线程同步问题
- 多线程的同步问题
- java多线程同步问题
- 关于多线程同步问题
- jsp多线程同步问题
- 多线程同步死锁问题
- servlet 多线程同步问题
- 多线程同步问题
- Servlet多线程同步问题
- linux mysql导入数据库
- 单例设计模式
- 函数、数组和指针的形参
- 有关深度学习领域的几点想法
- Mybatis实现数据的增删改查(CRUD)
- 多线程同步问题-练习题3-笔记整理
- SpringBoot非官方教程 | 第十五篇:Springboot整合RabbitMQ
- AngularJS 组件化
- 基础反病毒工具入门系列
- 机器学习路线图(附资料)
- hive环境---安装系列五
- 【POJ2187】Beauty Contest-凸包+旋转卡壳
- python_movie_apriori
- java中的静态属性初始化--static块