黑马程序员——唯一性
来源:互联网 发布:数控加工中心编程软件 编辑:程序博客网 时间:2024/05/17 01:12
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
运行结果:
上面的例子保证了Input和Output中使用的Res是同一个
在学习过程中发现有很多方法可以使得资源唯一,总结一下
1,使用静态
静态的特点:优先于对象存在,被所有对象所共享。
示例:
public class Ap{ static int i=47; public void call() { System.out.println("调用call()方法"); for(i=0;i<5;i++) { System.out.print(i+" "); if(i==4) { System.out.println("\n"); } } } public Ap(){} public static void main(String[] args) { Ap a1=new Ap(); Ap a2=new Ap(); a2.i=60; System.out.println("第一个实例对象调用变量i的结果:"+a1.i); a1.call(); System.out.println("第二个实例对象调用变量i的结果:"+a2.i); a2.call(); }}
运行结果:
从运行的结果可以看出a1和a2这两个对象调用的i都是同一个,原因是i是被静态所修饰的,使得被对象所共享。
2,单例设计模式
单例设计模式其实就是解决一个类在内存中只有一个对象。
这里就演示一下懒汉式。
class TestStream { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } //该类只能有一个实例 private TestStream(){} //私有无参构造方法 //该类必须自行创建 private static TestStream ts=null; //这个类必须自动向整个系统提供这个实例对象 public static TestStream getTest(){ if(ts==null){ ts=new TestStream(); } return ts; } public void getInfo(){ System.out.println("output message "+name); } }public class TestMain { public static void main(String [] args){ TestStream s=TestStream.getTest(); s.setName("Java"); System.out.println(s.getName()); TestStream s1=TestStream.getTest(); s1.setName("Java"); System.out.println(s1.getName()); s.getInfo(); s1.getInfo(); if(s==s1){ System.out.println("创建的是同一个实例"); }else if(s!=s1){ System.out.println("创建的不是同一个实例"); }else{ System.out.println("application error"); } } }运行结果:
3,构造函数
下面是一个多线程通信中的示例
class Res{String name;String sex;boolean flag;}class Input implements Runnable{private Res r;Input(Res r) { this.r = r;} public void run() { int x=0; while(true) { synchronized(r) { if(r.flag) try{r.wait();}catch(Exception e){} if(x==0) { r.name="jake"; r.sex = "man"; } else { r.name="李丽"; r.sex= "女女女"; } x = (x+1)%2; r.flag = true; r.notify(); } } }}class Output implements Runnable{ private Res r;Output(Res r){ this.r = r;} public void run() { while(true) { synchronized(r) { if(!r.flag) try{r.wait();}catch(Exception e){} System.out.println(r.name+"....."+r.sex); r.flag = false; r.notify(); } }}}class InputOutDemo{public static void main(String[] args) {Res r = new Res();Input i = new Input(r);Output o = new Output(r); Thread t1 = new Thread(i);Thread t2 = new Thread(o);t1.start();t2.start();}}
上面的例子保证了Input和Output中使用的Res是同一个
0 0
- 黑马程序员——唯一性
- 黑马程序员——HashSet如何判断一个元素的唯一性
- 黑马程序员——java基础——Java集合中TreeSet实现元素唯一性的方法
- 黑马程序员——集合的特殊功能之HashSet集合如何保证元素的唯一性
- 黑马程序员——集合的特殊功能之TreeSet集合如何保证元素的唯一及排序的
- 黑马程序员—泛型
- 黑马程序员—多线程
- 黑马程序员—DOM
- 黑马程序员—javabean
- 黑马程序员—xml
- 黑马程序员—多线程
- 黑马程序员—反射
- 黑马程序员—多线程
- 黑马程序员—HTML
- 黑马程序员—反射
- 黑马程序员—泛型
- 黑马程序员—API
- 黑马程序员—代理
- Revit API 部分构件几何数据无法获取问题
- 深入理解ServletRequest与ServletResponse
- EL表达式与JSTL(C)标签
- arcgis server 发布的mdb格式空间数据无法显示地图
- SAT数学常见几何词汇
- 黑马程序员——唯一性
- mysql怎么让一个存储过程定时执行
- MyBatis配置文件报错
- android listview gridview等自定义滚动条样式(非反射)
- Jquery表单验证插件–Validform
- 好用 linux下通过yum安装svn及配置
- iTunes Connect 使用总结
- web前端杂记(1)--JS DOM树操作简记
- oracle笔记一(sql语句方面)