Java线程安全中的单例模式
package net.kitbox.util;
/**
*
* @author lldy
*
*/
public class Singleton {
private Singleton(){
}
private static class SingletonHolder{
private static Singleton instance = new Singleton();
}
public static void method(){
SingletonHolder.instance._method();
}
private void _method(){
System.out.println("Singleton Method!");
}
public static void main(String[] args) {
Singleton.method();
}
}
此种写法利用了类加载器的加载原理,每个类只会被加载一次,这样单例对象在其内部静态类被加载的时候生成,而且此过程是线程安全的。
其中method()方法封装内部单例对象的私有方法,作为对外接口使用,这样就可以如下调用
Singleton.method();
//频繁使用时比常见的 Singleton.getInstance().method()要省事
另外一种方式为采用枚举来实现。
以上就是本文的全部内容了,希望大家能够喜欢。
相关推荐
-
java多线程之线程安全的单例模式
概念: java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例. 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例.在计算机系统中,线程池.缓存.日志对象.对话框.打印机.显卡的驱动程序对象常被设计成单例.这些应用都或多或少具有资源管理器的功能.每台计算机可以有若干个打印机,但只能有一个Printer
-
Java 单例模式线程安全问题
Java 单例模式线程安全问题 SpringIOC容器默认提供bean的访问作用域是单例模式.即在整个application生命周期中,只有一个instance.因此在多线程并发下,会有线程安全风险.我们在MVC框架下的servlet就是线程安全的.由于该servlet是在客户端,多并发相对少,但是对于web service端,需要考虑到. ThreadLocal类:为每一个线程提供了一个独立的变量(实例)副本,从各将各个不同的实例访问isolation. 在同步锁机制中,后来者线程等待先行线程
-
Java线程安全中的单例模式
复制代码 代码如下: package net.kitbox.util; /** * * @author lldy * */ public class Singleton { private Singleton(){ } private static class SingletonHolder{ private static Singleton instance = new Singleton(); } public static
-
浅谈JAVA 线程状态中可能存在的一些误区
BLOCKED 和 WAITING 的区别 BLOCKED 和 WAITING 两种状态从结果上来看,都是线程暂停,不会占用 CPU 资源,不过还是有一些区别的 BLOCKED 等待 Monitor 锁的阻塞线程的线程状态,处于阻塞状态的线程正在等待 Monitor 锁进入 synchronized Block 或者 Method ,或者在调用 Object.wait 后重新进入同步块/方法.简单的说,就是线程等待 synchronized 形式的锁时的状态 下面这段代码中, t1 在等待
-
Java线程池中多余的线程是如何回收的
最近阅读了JDK线程池ThreadPoolExecutor的源码,对线程池执行任务的流程有了大体了解,实际上这个流程也十分通俗易懂,就不再赘述了,别人写的比我好多了. 不过,我倒是对线程池是如何回收工作线程比较感兴趣,所以简单分析了一下,加深对线程池的理解吧. 那么,就以JDK1.8为例分析吧. 1.runWorker(Worker w) 工作线程启动后,就进入runWorker(Worker w)方法. 里面是一个while循环,循环判断任务是否为空,若不为空,执行任务:若取不到任务,或发生异
-
Java线程通信中关于生产者与消费者案例分析
相关方法: wait():一旦执行此方法,当前线程就进入阻塞状态,并释放同步监视器. notify():一旦执行此方法,就会唤醒被wait的一个线程,如果有多个线程被wait,就唤醒优先级高的那个. notifyAll():一旦执行此方法,就会唤醒所有被wait的线程. 说明: 1.wait(),notify(),notifyAll()三个方法必须使用在同步代码块或同步方法中. 2.wait(),notify(),notifyAll()三个方法的调用者必须是同步代码块或同步方法中的同步监视器.
-
java线程池中线程数量到底是几
目录 线程池配置 线程池里的业务线程数量小于最小数量(5) 第一个请求 第二个请求 第三个请求 第五个请求 小于阻塞队列容量(10) 第六个请求 第七个请求 第15个请求 小于最大数量(20) 第16个请求 第35个请求 拒绝策略 第36个请求 复用线程 线程池配置 线程池配置,假设是: 1.最小数量是5 2.阻塞队列容量是10 3.最大数量是20 线程池里的业务线程数量小于最小数量(5) 第一个请求 第一个请求进来的时候,这个时候,线程池没有线程,就创建新的工作线程(即Worker线程). 然
-
java线程池中Worker线程执行流程原理解析
目录 引言 Worker类分析 runWorker(Worker)方法 getTask()方法 beforeExecute(Thread, Runnable)方法 afterExecute(Runnable, Throwable)方法 processWorkerExit(Worker, boolean)方法 tryTerminate()方法 terminated()方法 引言 在<[高并发]别闹了,这样理解线程池执行任务的核心流程才正确!!>一文中我们深度分析了线程池执行任务的核心流程,在Th
-
Java线程并发中常见的锁机制详细介绍
随着互联网的蓬勃发展,越来越多的互联网企业面临着用户量膨胀而带来的并发安全问题.本文着重介绍了在java并发中常见的几种锁机制. 1.偏向锁 偏向锁是JDK1.6提出来的一种锁优化的机制.其核心的思想是,如果程序没有竞争,则取消之前已经取得锁的线程同步操作.也就是说,若某一锁被线程获取后,便进入偏向模式,当线程再次请求这个锁时,就无需再进行相关的同步操作了,从而节约了操作时间,如果在此之间有其他的线程进行了锁请求,则锁退出偏向模式.在JVM中使用-XX:+UseBiasedLocking pac
-
简单分析Java线程编程中ThreadLocal类的使用
一.概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名为ThreadLocalVar更加合适.线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突. 从线程的角度看,每个线程都保持一个对
-
详解Java线程编程中的volatile关键字的作用
1.volatile关键字的两层语义 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的. 2)禁止进行指令重排序. 先看一段代码,假如线程1先执行,线程2后执行: //线程1 boolean stop = false; while(!stop){ doSomething(); } //线程2 stop = true; 这段代码是很典型
-
Java线程池中的各个参数如何合理设置
一.前言 在开发过程中,好多场景要用到线程池.每次都是自己根据业务场景来设置线程池中的各个参数. 这两天又有需求碰到了,索性总结一下方便以后再遇到可以直接看着用. 虽说根据业务场景来设置各个参数的值,但有些万变不离其宗,掌握它的原理对如何用好线程池起了至关重要的作用. 那我们接下来就来进行线程池的分析. 二.ThreadPoolExecutor的重要参数 我们先来看下ThreadPoolExecutor的带的那些重要参数的构造器. public ThreadPoolExecutor(int co
随机推荐
- AngularJS在IE8的不支持的解决方法
- 解决MyEclipse6.5无法启动,一直停留刚开始启动界面的详解
- pytyon 带有重复的全排列
- django自定义Field实现一个字段存储以逗号分隔的字符串
- 127.0.0.1无法访问,没有权限: GetObject
- 分享下mysql各个主要版本之间的差异
- Android编程之非调用系统界面实现发送彩信的方法(MMS)
- 解决vue-cli中stylus无法使用的问题方法
- js跑步算法的实现代码
- Js自定义多选框效果的实例代码
- 手动清除病毒文件流程(图解) by bark
- Android下的POS打印机调用的简单实现
- Flex中最好的MVC框架Mate框架
- Nginx下支持Thinkphp URL Rewrite的配置示例
- 使用referer指令配置Nginx服务器来防止图片盗链
- Centos Linux7设置静态IP的实例
- 图解二叉树的三种遍历方式及java实现代码
- 深入PHP magic quotes的详解
- Android编程使用Service实现Notification定时发送功能示例
- C++ 11实现检查是否存在特定的成员函数