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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈国斌 中级黑马   /  2013-5-10 21:20  /  1201 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 陈国斌 于 2013-5-12 08:41 编辑

JDK1.5中提供了多线程升级解决方案:
将同步synchronized替换成了显示的lock操作
那么,我们在写懒汉式时,可以用lock方式写吗?如果可以的话,怎么写,最好附代码,谢谢!

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

5 个回复

正序浏览
如果问题解决了,请将分类改为“已解决”,谢谢
回复 使用道具 举报
多谢两位的帮助
回复 使用道具 举报
思想:
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;
}
}

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 fjl_fight 于 2013-5-11 08:27 编辑
  1. package test;

  2. import java.util.concurrent.locks.Lock;
  3. import java.util.concurrent.locks.ReentrantLock;
  4. /**
  5. *
  6. * @author fjl
  7. *多看一下java API,就能找到实现方法
  8. */
  9. class Single{
  10.         private static Single s=null;
  11.         //构造方法私有化
  12.         private Single(){}
  13.         //创建一个锁对象,由于getInstance()是静态方法,则必须是静态成员该方法才能访问,
  14.         //并将锁声明成final类型,保持该对象不变且只有一个Lock对象
  15.         private static final Lock lock=new ReentrantLock();
  16.         //获得单例实例
  17.         public static Single getInstance(){               
  18.                 //如果为空
  19.                 if(s==null){
  20.                         //获取锁
  21.                         lock.lock();
  22.                         
  23.                    //如果该锁未被其他线程保持(可以查看API),即当前锁是空闲状态
  24.                   if(lock.tryLock()){
  25.                     if(s==null){
  26.                             //实例化Single对象
  27.                           s=new Single();
  28.                     }
  29.                   }
  30.                 }
  31.                 //返回
  32.                 return s;
  33.         }
  34. }

  35. //多线程下测试
  36. class Test1 implements Runnable{

  37.         @Override
  38.         public void run() {
  39.                 // TODO Auto-generated method stub
  40.                 while(true){
  41.                 try {
  42.                         Thread.sleep(100);
  43.                 } catch (InterruptedException e) {
  44.                         // TODO Auto-generated catch block
  45.                         e.printStackTrace();
  46.                 }
  47.                 System.out.println(this+"-->"+Single.getInstance());
  48.         }
  49.         }
  50. }
  51. //多线程测试
  52. class Test2 implements Runnable{

  53.         @Override
  54.         public void run() {
  55.                 // TODO Auto-generated method stub
  56.                 while(true){
  57.                 try {
  58.                         Thread.sleep(1000);
  59.                 } catch (InterruptedException e) {
  60.                         // TODO Auto-generated catch block
  61.                         e.printStackTrace();
  62.                 }
  63.                
  64.                 System.out.println(this+"-->"+Single.getInstance());
  65.         }
  66.         }
  67. }
  68. public class Demo01 {

  69.         /**
  70.          * @param args
  71.          */
  72.         public static void main(String[] args) {
  73.                 // TODO Auto-generated method stub

  74. //                Single s1=Single.getInstance();
  75. //                Single s2=Single.getInstance();
  76. //                System.out.println(s1==s2);
  77.                
  78.                 //多线程下测试
  79.                 Thread one=new Thread(new Test1());
  80.                 Thread one1=new Thread(new Test1());
  81.                 Thread one2=new Thread(new Test1());
  82.                 Thread two=new Thread(new Test2());
  83.                 Thread two1=new Thread(new Test2());
  84.                 Thread two2=new Thread(new Test2());
  85.                 two.start();
  86.                 two1.start();
  87.                 two2.start();
  88.                 one.start();
  89.                 one1.start();
  90.                 one2.start();
  91.         }

  92. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马