zoukankan      html  css  js  c++  java
  • 关于单例模式、同步synchronized

    public class SyncObj {    private static SyncObj obj = null;    private SyncObj(){     }    public static SyncObj getIns(){   if(obj==null){    System.out.println("obj=null");    obj = new SyncObj();    return obj;   }   return obj;  }  public synchronized void say(){   System.out.println("hello world..");  } }

    ================================== 在普通的main方法里测,没什么问题 ================================== public static void main(String[] args) {   // TODO Auto-generated method stub   SyncObj obj1 = SyncObj.getIns();   SyncObj obj2 = SyncObj.getIns();   obj1.say();   obj2.say();   System.out.println(obj1);   System.out.println(obj2); obj1、obj2是同一个object

    ==================================== 但是在线程里,就不一定是这样了 ====================================

    --------------------------------- 1.主线程跟子线程都去获得这个实例 --------------------------------- public class MyThread extends Thread{  @Override  public void run() {   super.run();   SyncObj obj1 = SyncObj.getIns();   System.out.println(Thread.currentThread().getName()+":"+obj1);   obj1.say();  }  }

    ----main方法里: public static void main(String[] args) {  SyncObj obj1 = SyncObj.getIns();  System.out.println(Thread.currentThread().getName()+":"+obj1);

     Thread th1 = new MyThread();  Thread th2 = new MyThread();  th1.start();  th2.start(); } ----这个里面obj都是同一个 ----因为主线程里先geIns(),就先初始化了SyncObj里的类变量, ----然后在子线程里得到的是同一个obj,所以SyncObj里的sync方法也有意义

    ------------------------------------ 2.主线程没有获得这个实例,直接开子线程 --也就是说子线程开始前,SyncObj没有没赋值 ------------------------------------ public static void main(String[] args) {  Thread th1 = new MyThread();  Thread th2 = new MyThread();  th1.start();  th2.start(); } ----结果是:********得到2个不同的obj******** ----所以这个SyncObj的sync方法也没有意义!!!

    ==================================================== 改进代码: SyncObj里加上static块: ==================================================== public class SyncObj { static{  if(obj==null){   obj = getIns();  } } 。。。 } ----这样就是得到同一个实例 ----sync的方法才有意义

  • 相关阅读:
    bzoj 3111 蚂蚁 动态规划
    bzoj3011 可并堆
    bzoj2693 莫比乌斯反演
    bzoj 2671 莫比乌斯反演
    bzoj2194 快速傅立叶之二 FFT
    bzoj1396&&2865 识别子串 后缀自动机+线段树
    安卓开发中使用ZXing生成解析二维码
    使用tencent协议发起临时会话
    使用zxing编写的二维码生成解析工具:QRCoder
    使用JavaScript获取浏览器Chrome版本信息
  • 原文地址:https://www.cnblogs.com/tomcatandjerry/p/2548186.html
Copyright © 2011-2022 走看看