亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Javasynchronized同步各方式略解

2019-11-14 15:14:07
字體:
來源:轉載
供稿:網友

  近段為了實現一個功能,在樹結構中,修改某個節點名稱時,需要同時修改這個節點所有子節點的節點全路徑屬性字段(類似"父父節點名稱/父節點名稱/子節點名稱/子子節點名稱"的構造)。因為在構造Update語句時,需要遞歸去查詢子節點以及構造全路徑的值,需要花費了一定的時間,等批量執行update語句時,可能子節點的某個子節點的名稱又改變了,會引起沖突,故用到了synchronized,順便了解了下實現方式,原理沒深入了解,在此記錄以便日后查看。

-----------------------------------------------------我是正文分割線--------------------我是正文分割線---------------------------

本文主要列舉不同的同步方式,以及我理解的使用范圍。

眾所周知,同步分為兩種用法:同步方法、與同步塊。

一、同步塊

1.1 類同步(非靜態方法)

· 實現方式:

 1 public class JustPlayServiceImplSyn2 { 2      3     public JustPlayServiceImplSyn2(){ 4          5     } 6     PRivate static int flag = 1; 7     public void Operate() {  8         synchronized(JustPlayServiceImplSyn2.class){ 9             flag++; 10             try { 11                 // 增加隨機性,讓不同線程能在此交替執行 12                 Thread.sleep(new Random().nextInt(5)); 13             } catch (InterruptedException e) { 14                 e.printStackTrace(); 15             } 16             flag--; 17             System.out.println("Thread: " + Thread.currentThread().getName() 18                     + " /Current flag: " + flag);19         }20     }21 }
View Code

· 測試代碼:

 1 public class JustPlay { 2     /** 3      * @param args 4      */ 5     public static void main(String[] args) { 6                new Thread("Thread-01") {  7                    public void run() {  8                        new JustPlayServiceImplSyn2().operate(); 9                     } 10                }.start(); // 啟動第一個線程11                12          new Thread("Thread-02") { 13                    public void run() { 14                        new JustPlayServiceImplSyn2().operate();15                    } 16                }.start(); // 啟動第一個線程17     }18 }
View Code

· 使用范圍:多對象多線程的同步。
  使用范圍最廣,代碼也簡單,在需要同步的代碼塊上加上synchronized關鍵字,并在括號類用[類名.class]就行。

1.2 this同步(非靜態方法)

· 實現方式:

 1 public class JustPlayServiceImplSyn2 { 2      3     public JustPlayServiceImplSyn2(){ 4          5     } 6     private static int flag = 1; 7     public  void operate_this() {  8         synchronized(this){ 9             flag++; 10             try { 11                 // 增加隨機性,讓不同線程能在此交替執行 12                 Thread.sleep(new Random().nextInt(5)); 13             } catch (InterruptedException e) { 14                 e.printStackTrace(); 15             } 16             flag--; 17             System.out.println("Thread: " + Thread.currentThread().getName() 18                     + " /Current flag: " + flag);19         }20     }21 }
View Code

· 測試代碼:

 1 public class JustPlay { 2  3     /** 4      * @param args 5      */ 6     public static void main(String[] args) { 7         final JustPlayServiceImplSyn2  justplayserviceimplsyn2= new JustPlayServiceImplSyn2(); 8            for(int i=0;i<100;i++){ 9                new Thread("Thread-001"){10                    public void run() {11                        justplayserviceimplsyn2.operate_this();12                    }13                }.start();14                new Thread("Thread-002"){15                    public void run() {16                        justplayserviceimplsyn2.operate_this();17                    }18                }.start();19     }20 }
View Code

· 使用范圍:單對象多線程的同步。

  在synchronized關鍵字后的括號內用this關鍵字。使用[this]同步時需要是同一對象的才能同步,多對象時是同步失敗的。因為同步是對this對象鎖,不同對象時鎖互不影響

 

1.3 靜態對象同步(非靜態方法)

· 實現方式:

 1 public class JustPlayServiceImpl { 2     private static JustPlayServiceImpl myobj = null; 3      4     private JustPlayServiceImpl(){ 5          6     } 7     public static JustPlayServiceImpl createJustPlayServiceImpl(){ 8         if(myobj==null){ 9             myobj = new JustPlayServiceImpl();10         }11         return myobj;12     }13     private static int flag = 1;14     public void operate() { 15         synchronized(myobj){16             flag++; 17             try { 18                 // 增加隨機性,讓不同線程能在此交替執行 19                 Thread.sleep(new Random().nextInt(5)); 20             } catch (InterruptedException e) { 21                 e.printStackTrace(); 22             } 23             flag--; 24             System.out.println("Thread: " + Thread.currentThread().getName() 25                     + " /Current flag: " + flag);26         }27     }28 }
View Code

· 測試代碼:

 1 public class JustPlay { 2  3     /** 4      * @param args 5      */ 6     public static void main(String[] args) { 7  8            for(int i=0;i<100;i++){ 9               new Thread("Thread-01") { 10                    public void run() { 11                        JustPlayServiceImpl.createJustPlayServiceImpl().operate())                   } 12                }.start(); // 啟動第一個線程13           new Thread("Thread-02") { 14                    public void run() { 15                        JustPlayServiceImpl.createJustPlayServiceImpl().operate()                   } 16                }.start(); // 啟動第二個線程17            }
View Code

· 使用范圍:單體類單對象多線程的同步。

  因為同步是對對象的同步鎖,只要保證同步塊對象唯一,就能實現同步。偷點懶,我直接將類變成了單體類,然后將唯一對象給鎖了。(ps:怎么感覺有點鬼畜。。。哈哈哈)

二、同步方法

2.1 靜態方法同步

· 實現方式:

 1 public class JustPlayServiceImplSyn2 { 2      3     public JustPlayServiceImplSyn2(){ 4          5     } 6     private static int flag = 1; 7     public synchronized static void operate_static(){ 8         flag++;  9         try { 10             // 增加隨機性,讓不同線程能在此交替執行 11             Thread.sleep(new Random().nextInt(5)); 12         } catch (InterruptedException e) { 13             e.printStackTrace(); 14         } 15         flag--; 16         System.out.println("Thread: " + Thread.currentThread().getName() 17                 + " /Current flag: " + flag);18     }19 }
View Code

· 測試代碼:

 1 public class JustPlay { 2  3     /** 4      * @param args 5      */ 6     public static void main(String[] args) { 7            for(int i=0;i<100;i++){ 8               new Thread("Thread-01") {  9                    public void run() { 10                        JustPlayServiceImplSyn2.operate_static();11                    } 12                }.start(); // 啟動第一個線程13                14          new Thread("Thread-02") { 15                    public void run() { 16                        JustPlayServiceImplSyn2.operate_static();17                    } 18                }.start(); // 啟動第一個線程19         }20     }21 }
View Code

· 使用范圍:靜態方法單對象多線程的同步。

  再次說[因為同步是對對象的同步鎖],而且調用靜態方法綁定的是類而不是對象,所以,同步了靜態方法,就是將相當于將類給鎖了,然后就同步了。原理與[1.1 類同步(非靜態方法)]一致。

2.2 非靜態方法同步

  2.2.1 單體類非靜態方法同步

  ·  實現方式:  

 1 public class JustPlayServiceImpl { 2     private static JustPlayServiceImpl myobj = null; 3      4     private JustPlayServiceImpl(){ 5          6     } 7     public static JustPlayServiceImpl createJustPlayServiceImpl(){ 8         if(myobj==null){ 9             myobj = new JustPlayServiceImpl();10         }11         return myobj;12     }13     private static int flag = 1;14     15     //單體類 此種同步方式有效16     public synchronized void operate2() { 17             flag++; 18             try { 19                 // 增加隨機性,讓不同線程能在此交替執行 20                 Thread.sleep(new Random().nextInt(5)); 21             } catch (InterruptedException e) { 22                 e.printStackTrace(); 23             } 24             flag--; 25             System.out.println("Thread: " + Thread.currentThread().getName() 26                     + " /Current flag: " + flag);27     }28 }
View Code

  · 測試代碼:

 1     public static void main(String[] args) { 2  3            for(int i=0;i<100;i++){ 4               new Thread("Thread-01") {  5                    public void run() {  6                        JustPlayServiceImpl.createJustPlayServiceImpl().operate2(); 7                    }  8                }.start(); // 啟動第一個線程 9                10            new Thread("Thread-02") { 11                    public void run() { 12                       JustPlayServiceImpl.createJustPlayServiceImpl().operate2();13                    } 14                }.start(); // 啟動第一個線程15            }16         }17 }
View Code

  · 使用范圍:單體類單對象多線程的同步。

    原理同[1.3 靜態對象同步(非靜態方法)]

  2.2.2 非單體類非靜態方法同步

  · 實現方式:

 1 public class JustPlayServiceImplSyn2 { 2      3     public JustPlayServiceImplSyn2(){ 4          5     } 6     private static int flag = 1; 7     //適用于單對象多線程 8     public synchronized void operate2() {  9             flag++; 10             try { 11                 // 增加隨機性,讓不同線程能在此交替執行 12                 Thread.sleep(new Random().nextInt(5)); 13             } catch (InterruptedException e) { 14                 e.printStackTrace(); 15             } 16             flag--; 17             System.out.println("Thread: " + Thread.currentThread().getName() 18                     + " /Current flag: " + flag);19     }20 }
View Code

  · 測試代碼:

 1 public class JustPlay { 2  3     /** 4      * @param args 5      */ 6     public static void main(String[] args) { 7         final JustPlayServiceImplSyn2  justplayserviceimplsyn2= new JustPlayServiceImplSyn2(); 8            for(int i=0;i<100;i++){ 9                new Thread("Thread-001"){10                    public void run() {11                        justplayserviceimplsyn2.operate2();12                    }13                }.start();14                new Thread("Thread-002"){15                    public void run() {16                        justplayserviceimplsyn2.operate2();17                    }18                }.start();19         }20 }
View Code

  · 使用范圍:單對象多線程的同步。

    原理同[1.2 this同步(非靜態方法)]

總結:對于網頁用Ajax方式多次調用的class,因為是多線程且不可控為單一對象,若想同步:解決方案是:1.1、1.3、2.1、2.2.1;對于1.2和2.2.2,調用的對象必須是保持同一個才會同步。

PS:覺得應該還有其他方式,隱隱的這么覺得。。。。。哈哈哈哈哈哈

------------------------------------結束的分割線--------------結束的分割線------------------有機會再去了解同步的底層原理去了----那時候再寫原理------またね!---

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av大片在线| 57pao成人国产永久免费| 一色桃子一区二区| 中文字幕最新精品| 亚洲免费小视频| 亚洲国产精品yw在线观看| x99av成人免费| 亚洲国产精品一区二区三区| 亚洲男人天堂网站| 亚洲黄色在线观看| 久久在精品线影院精品国产| 欧美野外猛男的大粗鳮| 亚洲午夜av电影| 精品一区二区亚洲| 在线成人免费网站| 一本色道久久88精品综合| 人妖精品videosex性欧美| 亚洲第一免费网站| 国产精品高潮呻吟久久av野狼| 狠狠色香婷婷久久亚洲精品| 久久伊人精品一区二区三区| 欧美成人免费播放| 日韩av综合网站| 亚洲国产中文字幕在线观看| 日韩中文字幕在线视频| 一本一本久久a久久精品综合小说| 亚洲午夜未满十八勿入免费观看全集| 国产精品免费一区二区三区都可以| 国产日本欧美在线观看| 国产精品国产三级国产aⅴ9色| 日韩精品免费观看| 国外成人免费在线播放| 在线性视频日韩欧美| 亚洲专区国产精品| 国产精品免费观看在线| 日韩中文字幕在线免费观看| 一本一本久久a久久精品综合小说| 精品亚洲一区二区三区| 亚洲精品女av网站| 久久精品欧美视频| 久久久久久久久久国产| 色噜噜国产精品视频一区二区| 久久免费精品日本久久中文字幕| 久久国产精品网站| 91高清免费视频| 国产精品久久久久久久久久久久久| 日韩av免费一区| 欧美成人精品一区二区| 久久大大胆人体| 尤物九九久久国产精品的分类| 中文字幕久精品免费视频| 国产成人亚洲综合| 伦伦影院午夜日韩欧美限制| 另类图片亚洲另类| 国产亚洲精品va在线观看| 97国产在线观看| 成人黄色在线免费| 国产精品中文字幕在线观看| 欧美日韩另类字幕中文| 岛国av一区二区在线在线观看| 国产成人免费av电影| 亚洲国产另类 国产精品国产免费| 日韩免费黄色av| 欧美精品第一页在线播放| 亚洲精品国产精品久久清纯直播| 91精品久久久久久久久久入口| 日韩色av导航| 日韩激情片免费| 精品视频在线观看日韩| 中日韩美女免费视频网站在线观看| 欧美人成在线视频| 亚洲va欧美va国产综合剧情| 国产成人福利夜色影视| 1769国内精品视频在线播放| 精品久久香蕉国产线看观看亚洲| 超碰日本道色综合久久综合| 成人黄色av免费在线观看| 精品久久久免费| 深夜福利91大全| 色综合天天综合网国产成人网| 日韩中文av在线| 国产在线视频91| 国产999在线观看| 成人动漫网站在线观看| 日韩中文字幕不卡视频| 福利视频第一区| 亚洲爱爱爱爱爱| 亚洲综合在线播放| 精品日本美女福利在线观看| 91精品91久久久久久| 欧美日韩在线影院| 综合136福利视频在线| 精品国产999| 欧美极品少妇xxxxⅹ裸体艺术| 国产自产女人91一区在线观看| 国产精品69精品一区二区三区| 日韩电影在线观看免费| 亚洲一区av在线播放| 亚洲欧美综合精品久久成人| 亚洲区一区二区| 亚洲三级免费看| 成年无码av片在线| 精品一区二区三区四区| 亚洲free性xxxx护士hd| 在线免费看av不卡| 欧美午夜性色大片在线观看| 久久免费在线观看| 一区二区三区四区精品| 全色精品综合影院| 精品久久久av| 欧美与欧洲交xxxx免费观看| 欧美性猛交xxxx乱大交3| 色婷婷综合久久久久| 久久精品亚洲精品| 久久综合伊人77777尤物| 国产精品人成电影在线观看| 情事1991在线| 国产一区二区av| 国产成人精品电影久久久| 欧美黑人一区二区三区| 在线观看亚洲区| 国产精品一二三视频| 97国产真实伦对白精彩视频8| 国产欧美中文字幕| 亚洲伊人久久综合| 国产亚洲欧美另类中文| 亚洲色图校园春色| 少妇高潮 亚洲精品| 日韩欧美国产成人| 国产剧情日韩欧美| 国产美女久久精品香蕉69| 国产日韩中文字幕在线| 国产成人福利网站| 国产性色av一区二区| 国产精欧美一区二区三区| 精品国产乱码久久久久久婷婷| 久久久久五月天| 欧美在线一区二区三区四| 成人激情春色网| 一区二区欧美久久| 韩国视频理论视频久久| y97精品国产97久久久久久| 国产精品久久久久久久9999| 欧美性猛交xxxx免费看漫画| 97在线观看免费高清| 国产日韩中文在线| 欧美有码在线视频| 精品久久久一区| 欧美电影免费观看高清完整| 日韩欧美精品网站| 久久的精品视频| 国产成人精品a视频一区www| 色偷偷综合社区| 91视频国产一区| 欧美激情欧美狂野欧美精品| 国产精品一区av| 日韩精品高清在线观看| 91人成网站www| 国产在线999| 国模吧一区二区| 日韩欧美精品网址| 日韩中文字幕在线观看| 亚洲的天堂在线中文字幕| 欧美性视频在线|