懒汉式的安全优化方式,两种方式。线程同时运行的时候,不会创建两个对象

来源:互联网 发布:stm32 压缩算法 编辑:程序博客网 时间:2024/06/01 08:47
/** * 懒汉式的安全优化方式,两种方式。 *  * @author jiaxutianhuo * */public class Singleton {// 私有化构造private Singleton() {// 私有化构造函数,不能用new Singleton来创造对象。// 只能通过getInstance创造对象,也就是用同一个对象。System.out.println("对象创建成功。");}// 全局对象private static Singleton singleton = null;// 懒汉式是非线程安全的。解决方式如下:// 关键字:synchronized:可用来给对象和方法或者代码块加锁,// 当它锁定一个方法或者一个代码块的时候,同一时刻最多只要一个线程执行这个代码。public static synchronized Singleton getInstance() {// 判断全局对象是否为空。if (singleton == null) {try {Thread.sleep(1000);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} // 休眠一秒钟,检测多线程的运行情况。// 如果为空,就创建该类对象。singleton = new Singleton();}// 如果不为空,就直接返回该对象。// 因为第一次创建的时候,就不为空了,// 所以在此创建的时候,判断不为空,直接返回该对象,// 所以两个对象是代表的一个对象。就是第一次创建的对象。return singleton;}///**// * 使用双重检测机制,实现线程安全的懒汉式// * @return// *///public static  Singleton getInstance() {//// 判断全局对象是否为空。//if (singleton == null) {//synchronized(Singleton.class){//if (singleton == null) {//singleton = new Singleton();//}//}////}//return singleton;//}public static void main(String[] args) {//多线程操作//创建多线程方式2:直接使用Thread操作/** * 如果没有synchronized,就会被两个线程同时创建,创建两个对象。 */Thread thread1=new Thread(){@Overridepublic void run() {// TODO Auto-generated method stub//Singleton ton=Singleton.getInstance();System.out.println(ton.hashCode());}};thread1.start();Thread thread2=new Thread(){@Overridepublic void run() {// TODO Auto-generated method stubSingleton ton2=Singleton.getInstance();System.out.println(ton2.hashCode());}};//开启新线程thread2.start();//此方法创建对象,ton1和ton2是同一个对象。}}

原创粉丝点击