Java 单例模式的实现资料整理
作者:超超boy 时间:2022-05-29 21:27:33
Java单例模式的实现,对java 单例模式的几种实现方法进行了整理:
单例模式好多书上都是这么写的:
public class SingleTon1 {
private SingleTon1(){
}
private static SingleTon1 instance = null;
public static SingleTon1 getInstance(){
if(instance == null){
instance = new SingleTon1();
}
return instance;
}
}
但是实际开发中是不会这么写的,因为有一个严重的问题,多线程并发访问的时候,可能会产生多个实例!!
下面列举几个常用的方法:
1.使用synchronized 关键字
package singleton;
public class SingleTon1 {
private SingleTon1(){
}
private static SingleTon1 instance = null;
//多线程问题解法一,但是效率不高!因为每次调用都会加锁!
public static synchronized SingleTon1 getInstance(){
if(instance == null){
instance = new SingleTon1();
}
return instance;
}
public void print(){
System.out.println("thread_id:"+Thread.currentThread().getId());
}
private static Object object = new Object();
//很巧妙的方法,只有在null的时候加锁,之后就不加啦
public static SingleTon1 getInstance2(){
if(instance == null){
synchronized (object){
instance = new SingleTon1();
}
}
return instance;
}
}
2.加锁
package singleton;
import java.util.concurrent.locks.ReentrantLock;
public class SingleTon2 {
private SingleTon2(){
}
private static ReentrantLock lock = new ReentrantLock();
private static SingleTon2 instance = null;
public void print(){
System.out.println("thread_id:"+Thread.currentThread().getId());
}
public static SingleTon2 getInstance2(){
if(instance == null){
lock.lock();
if(instance == null){ //注意这里还要判断下!!
instance = new SingleTon2();
}
lock.unlock();
}
return instance;
}
}
3.利用静态变量:
package singleton;
public class SingleTon3 {
public static void print(){
System.out.println("thread_id:"+Thread.currentThread().getId());
}
public static Nested getNested(){
return Nested.instance;
}
//这个是单例创建的类
static class Nested{
private Nested(){
}
static Nested instance = new Nested();
}
}
Test测试代码:
package singleton;
import singleton.SingleTon3.Nested;
public class Test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Nested singleton;
Myrunnable mm = new Myrunnable();
Myrunnable m1 = new Myrunnable();
Myrunnable2 m2 = new Myrunnable2();
new Thread(m1).start();
new Thread(m2).start();
if(m1.singleton == m2.singleton){ //是同一个
System.out.println("是同一个");
}else{
System.out.println("不是同一个");
}
}
}
class Myrunnable implements Runnable{
Nested singleton;
@Override
public void run() {
// TODO Auto-generated method stub
singleton = SingleTon3.getNested();
SingleTon3.print();
}
}
class Myrunnable2 implements Runnable{
Nested singleton;
@Override
public void run() {
// TODO Auto-generated method stub
singleton = SingleTon3.getNested();
SingleTon3.print();
}
}
输出:
是同一个
thread_id:11
thread_id:10
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
来源:http://www.cnblogs.com/jycboy/p/5892185.html
标签:Java,单例模式
0
投稿
猜你喜欢
Java C++实现相同MD5加密算法的方式
2023-10-12 12:26:02
Java虚拟机使用jvisualvm工具远程监控tomcat内存
2023-11-28 22:15:49
Android使用JobScheduler定期推送本地通知实例代码
2023-07-26 22:43:28
java IO流将一个文件拆分为多个子文件代码示例
2023-08-30 12:46:15
解决idea spring boot 修改html等不重启即时生效的问题
2023-11-13 18:37:47
java中lambda表达式简单用例
2023-11-24 23:17:52
java selenium Selenium IDE介绍及用法
2023-11-21 06:41:22
Java基础之容器Vector详解
2023-11-25 13:10:07
Java实现TopK问题的方法
2023-11-10 20:32:14
Gradle:修改默认的Build配置文件名方式
2023-11-28 20:18:01
RxJava2.x实现定时器的实例代码
2023-08-06 17:41:01
flutter实现发送验证码功能
2023-07-05 19:03:12
java之Object类用法实例
2023-11-05 04:14:26
java中Object类4种方法详细介绍
2023-11-03 16:06:12
Java真题实练掌握哈希表的使用
2023-11-09 06:33:15
一篇文章带你入门Java基本概念
2023-11-26 01:17:08
详解springboot和vue前后端分离开发跨域登陆问题
2023-08-07 00:48:38
spring boot集成smart-doc自动生成接口文档详解
2023-11-28 23:08:02
SpringBoot 创建web项目并部署到外部Tomcat
2023-09-15 18:25:04
SpringBoot自动配置原理详解
2023-08-19 09:25:55