synchronized 同步執行緒 單例設計模式+double checking
package xidian.lili.thread.syn;
//單例設計模式
public class SynDemo01 {
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
/*(
Jvm j1=Jvm.getInstance(1000);
Jvm j2=Jvm.getInstance(1000);
System.out.println(j1==j2);//單執行緒結果地址是一樣的
*/
JvmThread t1=new JvmThread(10);
JvmThread t2=new JvmThread(200);
t1.start();
t2.start();
}
}
class JvmThread extends Thread{
private long time;
public JvmThread(){
}
public JvmThread(long time){
this.time=time;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName()+"執行緒 建立物件"+Jvm.getInstance2(time));
} catch (InterruptedException e) {
e.printStackTrace();
}//單執行緒結果地址是一樣的
}
}
class Jvm{
//建立私有靜態變數
private static Jvm jvm;
//構造器私有化 確保外部不能建立物件
private Jvm(){
}
//建立對外的公共靜態方法 訪問私有靜態變數 +同步方法
public synchronized static Jvm getInstance(long time) throws InterruptedException{
if(jvm==null){
Thread.sleep(time);//在多執行緒裡 幾個執行緒進來之後延時 下面建立就會建立兩次
jvm=new Jvm();
}
return jvm;
}
public static Jvm getInstance2(long time) throws InterruptedException{
synchronized(Jvm.class){//同步快 不能this物件 靜態方法中沒有this物件 放入類的位元組碼資訊 效率低 不管這個時候有沒有物件都要等待
if(jvm==null){
Thread.sleep(time);//在多執行緒裡 幾個執行緒進來之後延時 下面建立就會建立兩次
jvm=new Jvm();
}
return jvm;
}
}
public static Jvm getInstance3(long time) throws InterruptedException{
//雙重檢查
if(jvm==null){//如果已經有物件 執行緒都不在等待 沒有物件在進去
synchronized(Jvm.class){//同步快 不能this物件 靜態方法中沒有this物件 放入類的位元組碼資訊 效率低
if(jvm==null){
Thread.sleep(time);//在多執行緒裡 幾個執行緒進來之後延時 下面建立就會建立兩次
jvm=new Jvm();
}
}
}
return jvm;
}
}
//單例設計模式
public class SynDemo01 {
/**
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
/*(
Jvm j1=Jvm.getInstance(1000);
Jvm j2=Jvm.getInstance(1000);
System.out.println(j1==j2);//單執行緒結果地址是一樣的
*/
JvmThread t1=new JvmThread(10);
JvmThread t2=new JvmThread(200);
t1.start();
t2.start();
}
}
class JvmThread extends Thread{
private long time;
public JvmThread(){
}
public JvmThread(long time){
this.time=time;
}
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName()+"執行緒 建立物件"+Jvm.getInstance2(time));
} catch (InterruptedException e) {
e.printStackTrace();
}//單執行緒結果地址是一樣的
}
}
class Jvm{
//建立私有靜態變數
private static Jvm jvm;
//構造器私有化 確保外部不能建立物件
private Jvm(){
}
//建立對外的公共靜態方法 訪問私有靜態變數 +同步方法
public synchronized static Jvm getInstance(long time) throws InterruptedException{
if(jvm==null){
Thread.sleep(time);//在多執行緒裡 幾個執行緒進來之後延時 下面建立就會建立兩次
jvm=new Jvm();
}
return jvm;
}
public static Jvm getInstance2(long time) throws InterruptedException{
synchronized(Jvm.class){//同步快 不能this物件 靜態方法中沒有this物件 放入類的位元組碼資訊 效率低 不管這個時候有沒有物件都要等待
if(jvm==null){
Thread.sleep(time);//在多執行緒裡 幾個執行緒進來之後延時 下面建立就會建立兩次
jvm=new Jvm();
}
return jvm;
}
}
public static Jvm getInstance3(long time) throws InterruptedException{
//雙重檢查
if(jvm==null){//如果已經有物件 執行緒都不在等待 沒有物件在進去
synchronized(Jvm.class){//同步快 不能this物件 靜態方法中沒有this物件 放入類的位元組碼資訊 效率低
if(jvm==null){
Thread.sleep(time);//在多執行緒裡 幾個執行緒進來之後延時 下面建立就會建立兩次
jvm=new Jvm();
}
}
}
return jvm;
}
}
相關文章
- 設計模式之單例模式(執行緒安全)設計模式單例執行緒
- 設計模式-單例模式之餓漢式-多執行緒設計模式單例執行緒
- 設計模式-單例模式之懶漢式-多執行緒設計模式單例執行緒
- Java多執行緒程式設計筆記2:synchronized同步方法Java執行緒程式設計筆記synchronized
- Java多執行緒程式設計筆記10:單例模式Java執行緒程式設計筆記單例模式
- 【設計模式】實現執行緒安全單例模式的五種方式設計模式執行緒單例
- 執行緒安全的單例模式執行緒單例模式
- Java多執行緒之執行緒同步【synchronized、Lock、volatitle】Java執行緒synchronized
- JavaScript 單執行緒之非同步程式設計JavaScript執行緒非同步程式設計
- JAVA_多執行緒_單例模式Java執行緒單例模式
- 簡單的執行緒同步問題:兩個執行緒交替執行N次【Synchronized、Lock、ArrayBlockingQueue】執行緒synchronizedBloC
- Java 多執行緒程式設計要點(synchronized)Java執行緒程式設計synchronized
- C++ 執行緒安全的單例模式C++執行緒單例模式
- Q:你瞭解非同步程式設計、程式、單執行緒、多執行緒嗎?非同步程式設計執行緒
- iOS多執行緒程式設計:執行緒同步總結iOS執行緒程式設計
- .NET多執行緒程式設計(3):執行緒同步 (轉)執行緒程式設計
- POSIX執行緒程式設計起步(2)-執行緒同步 (轉)執行緒程式設計
- Posix執行緒程式設計指南(3)-執行緒同步 (轉)執行緒程式設計
- @Java | Thread & synchronized – [ 執行緒同步鎖 基本使用]Javathreadsynchronized執行緒
- 單例模式(含執行緒鎖關鍵字)單例模式執行緒
- Future --- 多執行緒設計模式執行緒設計模式
- 非同步/同步,阻塞/非阻塞,單執行緒/多執行緒概念梳理非同步執行緒
- Unity3d遊戲開發之-單例設計模式-單例模式二:多執行緒二(雙重鎖定)Unity3D遊戲開發單例設計模式執行緒
- .NET多執行緒程式設計(4):執行緒池和非同步程式設計 (轉)執行緒程式設計非同步
- 單例模式——執行緒安全的兩種實現單例模式執行緒
- java併發程式設計——執行緒同步Java程式設計執行緒
- 執行緒同步(C#程式設計指南)執行緒C#程式設計
- Java多執行緒設計模式(1)Java執行緒設計模式
- python多執行緒程式設計3: 使用互斥鎖同步執行緒Python執行緒程式設計
- 不使用synchronized和lock,如何實現一個執行緒安全的單例?synchronized執行緒單例
- [設計模式]單例設計模式設計模式單例
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- JS單執行緒和非同步JS執行緒非同步
- 你的單例模式真的是執行緒安全的嗎?單例模式執行緒
- 設計模式-單例模式設計模式單例
- [設計模式] 單例模式設計模式單例
- 設計模式 —— 單例模式設計模式單例
- 設計模式(單例模式)設計模式單例