A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. package syn;

  2.         //不能改动此Test类       
  3.         public class Test extends Thread{
  4.                
  5.                 private TestDo testDo;
  6.                 private String key;
  7.                 private String value;
  8.                
  9.                 public Test(String key,String key2,String value){
  10.                         this.testDo = TestDo.getInstance();
  11.                         /*常量"1"和"1"是同一个对象,下面这行代码就是要用"1"+""的方式产生新的对象,
  12.                         以实现内容没有改变,仍然相等(都还为"1"),但对象却不再是同一个的效果*/
  13.                         this.key = key+key2;
  14.                         this.value = value;
  15.                 }


  16.                 public static void main(String[] args) throws InterruptedException{
  17.                         Test a = new Test("1","","1");
  18.                         Test b = new Test("1","","2");
  19.                         Test c = new Test("3","","3");
  20.                         Test d = new Test("4","","4");
  21.                         System.out.println("begin:"+(System.currentTimeMillis()/1000));
  22.                         a.start();
  23.                         b.start();
  24.                         c.start();
  25.                         d.start();

  26.                 }
  27.                
  28.                 public void run(){
  29.                         testDo.doSome(key, value);
  30.                 }
  31.         }

  32.         class TestDo {

  33.                 private TestDo() {}
  34.                 private static TestDo _instance = new TestDo();       
  35.                 public static TestDo getInstance() {
  36.                         return _instance;
  37.                 }

  38.                 public void doSome(Object key, String value) {
  39.        
  40.                         // 以大括号内的是需要局部同步的代码,不能改动!
  41.                         {
  42.                                 try {
  43.                                         Thread.sleep(1000);
  44.                                         System.out.println(key+":"+value + ":"
  45.                                                         + (System.currentTimeMillis() / 1000));
  46.                                 } catch (InterruptedException e) {
  47.                                         e.printStackTrace();
  48.                                 }
  49.                         }
  50.                 }

  51.         }
复制代码
以上是原题,其中有老师注解
本人有一种简单解法,用key.hashCode()作为互斥的锁即可:
  1. package syn;

  2. import java.util.concurrent.ArrayBlockingQueue;
  3. import java.util.concurrent.BlockingQueue;
  4. import java.util.concurrent.LinkedBlockingDeque;

  5. //不能改动此Test类       
  6. public class Test extends Thread {

  7.         private TestDo testDo;
  8.         private String key;
  9.         private String value;

  10.         public Test(String key, String key2, String value) {
  11.                 this.testDo = TestDo.getInstance();
  12.                 /*
  13.                  * 常量"1"和"1"是同一个对象,下面这行代码就是要用"1"+""的方式产生新的对象,
  14.                  * 以实现内容没有改变,仍然相等(都还为"1"),但对象却不再是同一个的效果
  15.                  */
  16.                 this.key = key + key2;
  17.                 this.value = value;
  18.         }

  19.         public static void main(String[] args) throws InterruptedException {
  20.                 Test a = new Test("1", "", "1");
  21.                 Test b = new Test("1", "", "2");
  22.                 Test c = new Test("3", "", "3");
  23.                 Test d = new Test("4", "", "4");
  24.                 System.out.println("begin:" + (System.currentTimeMillis() / 1000));
  25.                 a.start();
  26.                 b.start();
  27.                 c.start();
  28.                 d.start();

  29.         }

  30.         public void run() {
  31.                 testDo.doSome(key, value);
  32.         }
  33. }

  34. class TestDo {

  35.         private TestDo() {
  36.         }

  37.         private static TestDo _instance = new TestDo();

  38.         public static TestDo getInstance() {
  39.                 return _instance;
  40.         }

  41.         public void doSome(Object key, String value) {
  42.                 //解答如下:
  43.                 synchronized ((Integer) key.hashCode()) {
  44.                         // 以大括号内的是需要局部同步的代码,不能改动!
  45.                         {
  46.                                 try {
  47.                                         Thread.sleep(1000);
  48.                                         System.out.println(key + ":" + value + ":"
  49.                                                         + (System.currentTimeMillis() / 1000));
  50.                                 } catch (InterruptedException e) {
  51.                                         e.printStackTrace();
  52.                                 }
  53.                         }
  54.                 }
  55.         }
  56. }
复制代码



评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

1 个回复

倒序浏览
谢谢分享!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马