java设计模式-单例模式
package 单例模式;
/*
* 饿汉式
* 类加载到内存后 就实例化一个单例 JVM保证了线程安全
*
* 唯一缺点: 不管有用到与否 类加载时就完成实例化
* (话说你不用的 你装载它干嘛) -> 懒加载方式
*/
public class Mgr01 {
private Mgr01(){}
private static final Mgr01 instance = new Mgr01();
public static Mgr01 getInstance()
{
return instance;
}
public void m() {System.out.println("m");}
public static void main(String[] args) {
Mgr01 mgr01 = Mgr01.getInstance();
Mgr01 mgr02 = Mgr01.getInstance();
System.out.println(mgr01 == mgr02);
}
}
package 单例模式;
/*
* 和Mgr01一样
* =Mgr01
*/
public class Mgr02 {
private Mgr02(){}
private static final Mgr02 instance;
static {
instance = new Mgr02();
}
public static Mgr02 getInstance()
{
return instance;
}
public void m() {System.out.println("m");}
public static void main(String[] args) {
Mgr01 mgr01 = Mgr01.getInstance();
Mgr01 mgr02 = Mgr01.getInstance();
System.out.println(mgr01 == mgr02);
}
}
package 单例模式;
/*
* lazy loading
*
* 懒汉式
* 多线程访问会有影响
*
*/
public class Mgr03 {
private static Mgr03 instance;
private Mgr03()
{
}
public static Mgr03 getInstance()
{
if(instance == null)
{
try {
Thread.sleep(1);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
instance = new Mgr03();
}
return instance;
}
public void m() {System.out.println("m");}
public static void main(String[] args) {
for(int i = 0 ; i < 100; i++)
{
new Thread(()->
{
System.out.println(Mgr03.getInstance().hashCode());
}).start();
}
}
}
package 单例模式;
/*
* 加锁
* 效率就会降低
*
*/
public class Mgr04 {
private static Mgr04 instance;
private Mgr04()
{
}
public static synchronized Mgr04 getInstance()
{
if(instance == null)
{
try {
Thread.sleep(1);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
instance = new Mgr04();
}
return instance;
}
public void m() {System.out.println("m");}
public static void main(String[] args) {
for(int i = 0 ; i < 100; i++)
{
new Thread(()->
{
System.out.println(Mgr04.getInstance().hashCode());
}).start();
}
}
}
package 单例模式;
/*
*
*
*/
public class Mgr05 {
private static Mgr05 instance;
private Mgr05() {
}
public static Mgr05 getInstance() {
if (instance == null) {
//妄想通过减小同步代码块的方式提高效率,然后不可行
synchronized (Mgr05.class) {
try {
Thread.sleep(1);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
instance = new Mgr05();
}
}
return instance;
}
public void m() {
System.out.println("m");
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(() -> {
System.out.println(Mgr05.getInstance().hashCode());
}).start();
}
}
}
package 单例模式;
public class Mgr06 {
private volatile static Mgr06 instance;
private Mgr06() {
}
public static Mgr06 getInstance() {
if (instance == null) {
// 双重检查
synchronized (Mgr06.class) {
if (instance == null) {
try {
Thread.sleep(1);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
instance = new Mgr06();
}
}
}
return instance;
}
public void m() {
System.out.println("m");
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(() -> {
System.out.println(Mgr06.getInstance().hashCode());
}).start();
}
}
}
package 单例模式;
/*
* 静态内部类的方式
* JVM保证单例
* 加载外部类时不会加载内部类 这样可以实现懒加载
*/
public class Mgr07 {
private Mgr07()
{
}
private static class Mgr07Holder
{
private final static Mgr07 instance = new Mgr07();
}
public static Mgr07 getInstance() {
return Mgr07Holder.instance;
}
public void m() {
System.out.println("m");
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(() -> {
System.out.println(Mgr07.getInstance().hashCode());
}).start();
}
}
}
package 单例模式;
/*
* 不仅可以解决线程同步,还能防止反序列化
*/
public enum Mgr08 {
instace;
public void m() {}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(() -> {
System.out.println(Mgr08.instace.hashCode());
}).start();
}
}
}
保持好奇心!

浙公网安备 33010602011771号