黑马程序员技术交流社区
标题: 请教关于单例设计模式懒汉式 [打印本页]
作者: 陈国斌 时间: 2013-5-10 21:20
标题: 请教关于单例设计模式懒汉式
本帖最后由 陈国斌 于 2013-5-12 08:41 编辑
JDK1.5中提供了多线程升级解决方案:
将同步synchronized替换成了显示的lock操作
那么,我们在写懒汉式时,可以用lock方式写吗?如果可以的话,怎么写,最好附代码,谢谢!
作者: fjl_fight 时间: 2013-5-10 22:57
本帖最后由 fjl_fight 于 2013-5-11 08:27 编辑
- package test;
- import java.util.concurrent.locks.Lock;
- import java.util.concurrent.locks.ReentrantLock;
- /**
- *
- * @author fjl
- *多看一下java API,就能找到实现方法
- */
- class Single{
- private static Single s=null;
- //构造方法私有化
- private Single(){}
- //创建一个锁对象,由于getInstance()是静态方法,则必须是静态成员该方法才能访问,
- //并将锁声明成final类型,保持该对象不变且只有一个Lock对象
- private static final Lock lock=new ReentrantLock();
- //获得单例实例
- public static Single getInstance(){
- //如果为空
- if(s==null){
- //获取锁
- lock.lock();
-
- //如果该锁未被其他线程保持(可以查看API),即当前锁是空闲状态
- if(lock.tryLock()){
- if(s==null){
- //实例化Single对象
- s=new Single();
- }
- }
- }
- //返回
- return s;
- }
- }
- //多线程下测试
- class Test1 implements Runnable{
- @Override
- public void run() {
- // TODO Auto-generated method stub
- while(true){
- try {
- Thread.sleep(100);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- System.out.println(this+"-->"+Single.getInstance());
- }
- }
- }
- //多线程测试
- class Test2 implements Runnable{
- @Override
- public void run() {
- // TODO Auto-generated method stub
- while(true){
- try {
- Thread.sleep(1000);
- } catch (InterruptedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
-
- System.out.println(this+"-->"+Single.getInstance());
- }
- }
- }
- public class Demo01 {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- // Single s1=Single.getInstance();
- // Single s2=Single.getInstance();
- // System.out.println(s1==s2);
-
- //多线程下测试
- Thread one=new Thread(new Test1());
- Thread one1=new Thread(new Test1());
- Thread one2=new Thread(new Test1());
- Thread two=new Thread(new Test2());
- Thread two1=new Thread(new Test2());
- Thread two2=new Thread(new Test2());
- two.start();
- two1.start();
- two2.start();
- one.start();
- one1.start();
- one2.start();
- }
- }
复制代码
作者: Super_Class 时间: 2013-5-11 11:18
思想:
1,不让其他程序创建该类对象。
2,在本类中创建一个本类对象。
3,对外提供方法,让其他程序获取这个对象。
步骤:
1,因为创建对象都需要构造函数初始化,只要将本类中的构造函数私有化,其他程序就无法再创建该类对象;
2,就在类中创建一个本类的对象;
3,定义一个方法,返回该对象,让其他程序可以通过方法就得到本类对象。(作用:可控)
代码体现:
1,私有化构造函数;
2,创建私有并静态的本类对象;
3,定义公有并静态的方法,返回该对象。
---------------------------------------------
//饿汉式
class Single{
private Single(){} //私有化构造函数。
private static Single s = new Single(); //创建私有并静态的本类对象。
public static Single getInstance(){ //定义公有并静态的方法,返回该对象。
return s;
}
}
---------------------------------------------
//懒汉式:延迟加载方式。
class Single2{
private Single2(){}
private static Single2 s = null;
public static Single2 getInstance(){
if(s==null)
s = new Single2();
return s;
}
}
作者: 陈国斌 时间: 2013-5-11 15:39
多谢两位的帮助
作者: 黄玉昆 时间: 2013-5-11 22:57
如果问题解决了,请将分类改为“已解决”,谢谢
| 欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |