package com.Thread_Java.m2;
public class SingleTon_Thread_Safe {
static Bank b1 = null;
static Bank b2 = null;
public static void main(String[] args) throws InterruptedException {
Thread t1 =new Thread(){
@Override
public void run() {
b1=Bank.getInstance();
}
};
t1.start();
Thread t2=new Thread(){
@Override
public void run() {
b2=Bank.getInstance();
}
};
t2.start();
t1.join();
t2.join();
System.out.println(b2==b1);
}
}
class Bank {
private static Bank instance = null;
/* //线程安全的方式1
public static synchronized Bank getInstance() { //声明方法为同步的 静态方法:同步监视器是当前类的本身 Bank.class(类加载只会加载一次,所以是唯一的)
if (instance == null) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
instance = new Bank();
}
Thread.yield();//让出
return instance;
}*/
/* //线程安全的方式2
public static synchronized Bank getInstance() { //声明方法为同步的 静态方法:同步监视器是当前类的本身 Bank.class(类加载只会加载一次,所以是唯一的)
synchronized (Bank.class) {
if (instance == null) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
instance = new Bank();
}
Thread.yield();//让出
return instance;
}
}*/
//线程安全的方式3 是这三个方式中效率最高的
public static synchronized Bank getInstance() { //声明方法为同步的 静态方法:同步监视器是当前类的本身 Bank.class(类加载只会加载一次,所以是唯一的)
if (instance==null) { //synchronized () 只有一个线程才能进去
synchronized (Bank.class) {
if (instance == null) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
instance = new Bank();
}
}
}
Thread.yield();//让出
return instance;
}
}
懒汉式的线程安全
最新推荐文章于 2024-10-10 09:56:47 发布