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多執行緒程式設計筆記10:單例模式Java執行緒程式設計筆記單例模式
- 【設計模式】實現執行緒安全單例模式的五種方式設計模式執行緒單例
- Java多執行緒程式設計筆記2:synchronized同步方法Java執行緒程式設計筆記synchronized
- Java多執行緒之執行緒同步【synchronized、Lock、volatitle】Java執行緒synchronized
- JavaScript 單執行緒之非同步程式設計JavaScript執行緒非同步程式設計
- 單例模式執行緒安全reorder問題單例模式執行緒
- @Java | Thread & synchronized – [ 執行緒同步鎖 基本使用]Javathreadsynchronized執行緒
- C#多執行緒程式設計-基元執行緒同步構造C#執行緒程式設計
- 非同步/同步,阻塞/非阻塞,單執行緒/多執行緒概念梳理非同步執行緒
- java併發程式設計——執行緒同步Java程式設計執行緒
- 多執行緒設計模式之Worker Thread模式執行緒設計模式thread
- 設計模式(單例模式)設計模式單例
- [設計模式] 單例模式設計模式單例
- 設計模式-單例模式設計模式單例
- 設計模式 —— 單例模式設計模式單例
- 設計模式 單例模式設計模式單例
- 設計模式——單例模式設計模式單例
- 不使用synchronized和lock,如何實現一個執行緒安全的單例?synchronized執行緒單例
- 你的單例模式真的是執行緒安全的嗎?單例模式執行緒
- Java多執行緒—執行緒同步(單訊號量互斥)Java執行緒
- 設計模式之單例設計模式設計模式單例
- JS單執行緒和非同步JS執行緒非同步
- 單例設計模式單例設計模式
- 設計模式(一)_單例模式設計模式單例
- 常用設計模式-單例模式設計模式單例
- 設計模式之單例模式設計模式單例
- Java設計模式【單例模式】Java設計模式單例
- Java設計模式 | 單例模式Java設計模式單例
- 001設計模式:單例模式設計模式單例
- # Python設計模式 單例模式Python設計模式單例
- 設計模式一(單例模式)設計模式單例
- 設計模式之☞單例模式設計模式單例
- Java設計模式——單例模式Java設計模式單例
- Java設計模式–單例模式Java設計模式單例
- js設計模式--單例模式JS設計模式單例
- Java設計模式-單例模式Java設計模式單例
- 設計模式(二)——單例模式設計模式單例
- 設計模式之---單例模式設計模式單例