首页 > 代码库 > java懒汉式单例遇到多线程
java懒汉式单例遇到多线程
单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。
在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。
每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头。
1 public class SingletonThread implements Runnable { 2 private User u = null; 3 4 public static void main(String[] args) throws InterruptedException { 5 for(int i=0;i<1000;i++){ 6 SingletonThread t = new SingletonThread(); 7 SingletonThread t1 = new SingletonThread(); 8 Thread t3 = new Thread(t); 9 Thread t4 = new Thread(t1);10 t3.start();11 t4.start();12 t3.join(0);13 t4.join(0);14 if(t.getUser()!=t1.getUser())15 System.out.println("多线程引起单例创建失败...");16 }17 18 }19 public User getUser() {20 return u;21 }22 23 @Override24 public void run() {25 try {26 u = User.getInstance();27 } catch (InterruptedException e) {28 // TODO Auto-generated catch block29 e.printStackTrace();30 }31 }32 /*33 * 懒汉式单例--线程不安全34 * */35 public static class User {36 private User() {37 }38 39 private static User u = null;40 41 public static User getInstance() throws InterruptedException {42 if (u == null) {43 Thread.currentThread().sleep(1000);44 System.out.println("threadId:" + Thread.currentThread().getId());45 u = new User();46 }47 return u;48 }49 }50 /*51 * 恶汉式单例--线程安全52 * 53 * */54 public static class User1 {55 private User1() {}56 private static User1 u = new User1();57 58 public static User1 getInstance() throws InterruptedException {59 Thread.currentThread().sleep(1000);60 return u;61 }62 }63 64 }
java懒汉式单例遇到多线程
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。