6 单例模式与线程池

做j2ee如果不懂单例模式和线程池慢慢就是白学了。

线程池到处都能看到,httpsession,数据库连接池,redis连接池,MQ连接池。。。

使用场景:频繁使用且创建本消耗高

多线程环境下,使用场景随处可见...

饿汉式和懒汉式
名词懒得解释了。。。

懒汉式需要双重锁定
饿汉式没线程安全问题

1,双锁单例模式,懒汉式

 1  /// 定义一个全局访问点
 2         /// 设置为静态方法
 3         /// 则在类的外部便无需实例化就可以调用该方法
 4         public static Singleton GetInstance()
 5         {
 6             //这里可以保证只实例化一次
 7             //即在第一次调用时实例化
 8             //以后调用便不会再实例化
 9             //第一重 singleton == null
10             if (singleton == null)
11             {
12                 lock (syncObject)
13                 {
14                     //第二重 singleton == null
15                     if (singleton == null)
16                     {
17                         singleton = new Singleton();
18                     }
19                 }
20             }
21             return singleton;
22         }
23
24  

2,静态工厂方法,也是饿汉式最简单写法。

 1 public class Singleton{
 2     //initailzed during class loading
 3     private static final Singleton INSTANCE = new Singleton();
 4
 5     //to prevent creating another instance of Singleton
 6     private Singleton(){}
 7
 8     public static Singleton getSingleton(){
 9         return INSTANCE;
10     }
11 }

spring配置的sessionFactory \DataSource都是默认单例。例如:

1        //获取spring创建的bean对象
2     public synchronized static MyCache getInstance() {
3
4       return  ServletUtil.getApplicationContext().getBean( MyCache.class);
5
6     }

3,序列化对象,枚举实现单例基本是炫技,

最后:

单核心的多线程,不会有2个线程同时进入if判断,本质还是一个线程。但多核心的,就完全可能2线程同时一个if判断。

单例的范围:

本文的单例的范围是AppDomain. 
要在一个AppDomain中保持单例的办法是, 只在Main()中new这个对象一次, 然后把这个对象的引用赋值给所用使用它的对象.

如果要在操作系统中实现单例, 就需要使用Mutex(对象互斥锁)了。一个程序只允许运行一个实例,即不能多开。在我写C#桌面程序时经常用到。

如果要在Internet上实现单例, 可以使用URL唯一.

时间: 2024-12-20 11:41:36

6 单例模式与线程池的相关文章

Net线程池设计

Net线程池设计 功能描述: 支持创建多个线程池,并统一管理 支持不同线程池的容量控制,以及最少活动线程的设置 支持不同线程池中活动线程的闲时设置,即线程空闲时间到期后即自动被回收 结构设计: ThreadWorkerPoolManager: 线程池管理器,用于统一创建,获取,销毁线程池,使用单例模式 ThreadWorkerPool: 线程池,用于管理指定数量的线程,由ThreadWorkerPoolManager管理,自身无法创建与销毁 TheadWorkerPoolItem: 线程池项,用

Nutshell.ThreadWorkerPool .Net线程池设计

功能描述: 支持创建多个线程池,并统一管理 支持不同线程池的容量控制,以及最少活动线程的设置 支持不同线程池中活动线程的闲时设置,即线程空闲时间到期后即自动被回收 结构设计: ThreadWorkerPoolManager: 线程池管理器,用于统一创建,获取,销毁线程池,使用单例模式 ThreadWorkerPool: 线程池,用于管理指定数量的线程,由ThreadWorkerPoolManager管理,自身无法创建与销毁 TheadWorkerPoolItem: 线程池项,用于包装线程工作器,

自己动手实现简单的线程池

为了节省系统在多线程并发情况下不断的创建新和销毁线程所带来的性能浪费,就需要引入线程池. 线程池的基本功能就是线程复用.每当系统提交一个任务时,会尝试从线程池内取出空闲线程来执行它.如果没有空闲线程,这时候再创建新的线程.任务执行完毕,线程也不会立即销毁,而是加入到线程池中以便下次复用. Java提供了多种线程池的实现,以满足不同业务的需求.为了理解它们,下面给出一个最简单的线程池的实现. 线程池主要分为两大部分,线程池和一些永不退出的线程 首先是线程池部分: package optimisti

C++线程池2013年的博客迁移

线程基类头文件: #ifndef YTHREAD_H #define YTHREAD_H #include <iostream> using namespace std; #define  CERR(str) cout<<"error:"<< str<<std::endl #define  CINFO(str) cout<<"info:"<< str<<std::endl enum 

Java单例模式以及线程安全性的保证

1.单例模式有什么用处? 有一些对象只能使用一个,例如:数据库连接.线程池(threadpool).缓存(cache).对话框.处理偏好(preferences)设置和这侧表(registry)的对象.日志对象.充当打印机.显卡等设备的驱动程序的对象,即用于管理共享的资源.这种对象只能有一个实例,制造多个会导致问题. 2.最经典的单例模式?         /**      * 1.利用一个私有静态变量来记录Singleton类的唯一实例:      * 2.构造器声明为私有,只有Singlet

线程池的原理与实现

java中的线程池框架为Executors,但是这里我们将自己实现简单的线程池,主要目的是理解它的原理. 线程池主要由两个部分组成: (1)线程数组,用于执行任务. (2)任务队列. 下面的两个实现都是按照这种思路来做的. 一.简单的线程池,有点问题 package com.chuiyuan.utils; import java.util.LinkedList; /** * Created by chuiyuan on 2/21/16. * start: * create a new threa

C#多线程和线程池

1.概念  1.0 线程的和进程的关系以及优缺点 windows系统是一个多线程的操作系统.一个程序至少有一个进程,一个进程至少有一个线程.进程是线程的容器,一个C#客户端程序开始于一个单独的线程,CLR(公共语言运行库)为该进程创建了一个线程,该线程称为主线程.例如当我们创建一个C#控制台程序,程序的入口是Main()函数,Main()函数是始于一个主线程的.它的功能主要 是产生新的线程和执行程序.C#是一门支持多线程的编程语言,通过Thread类创建子线程,引入using System.Th

关于线程池,那些你还不知道的事

一.背景 最近在学习线程相关的知识,然后顺理成章少不了学习线程池,刚开始在没有深入的学习之前,感觉线程池是很神秘的东西,而且完全想不到怎么才能实现一个自己的线程池,然后还能保证它的可用性,然后就一直琢磨,琢磨了一周才不多,也是网上各种查资料,终于明白了线程池的原理,也自己手写一个线程池,来加深印象,那么本文我们就来聊一聊关于线程池的知识,希望更多的猿友能看到,从此对线程池有一个清晰直观的认识. 二.概念解析 1.什么是线程池 线程池的基本思想是一种对象池,在程序启动时就开辟一块内存空间,里面存放

线程池原理和简单实现

1.线程池原理 :伪代码 在线程池中假设最多开3个线程,当小于三个,进行创建,添加到集合中,然后不停的轮训线程集合进行执行,直到为空时,进入等待状态 public class ThreadPool { int maxCount = 3;//假设最多开只能开三个线程 AtomicInteger count =new AtomicInteger(0);// 当前开的线程数 count=0,为了线程同步,使用此api LinkedList<Runnable> runnables = new Link