日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java面包屑实现_在Java中实现过滤器和面包店锁

發布時間:2023/12/3 java 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java面包屑实现_在Java中实现过滤器和面包店锁 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

java面包屑實現

為了了解鎖的工作原理,實現自定義鎖是一種好方法。 這篇文章將展示如何在Java上實現Filter和Bakery鎖(自旋鎖),并將它們的性能與Java的ReentrantLock進行比較。 過濾器鎖和面包房鎖滿足互斥并且也是無饑餓算法,面包房鎖是先到先服務的鎖[1]。

為了進行性能測試,使用不同的鎖類型,不同的線程數和不同的次數將計數器值遞增到10000000。 測試系統配置為:Intel Core I7(具有8個內核,其中4個是真實的),Ubuntu 14.04 LTS和Java 1.7.0_60。

過濾器鎖具有n-1個級別,可以視為“候診室”。 獲取鎖之前,必須有一個線程穿過此等候室。 級別[2]有兩個重要屬性:

  • 至少一個嘗試進入級別l的線程成功。
  • 如果有多個線程試圖進入級別l ,則至少一個線程被阻止(即繼續在該級別上等待)。
  • 過濾器鎖定的實現如下:

    /** * @author Furkan KAMACI */ public class Filter extends AbstractDummyLock implements Lock { /* Due to Java Memory Model, int[] not used for level and victim variables. Java programming language does not guarantee linearizability, or even sequential consistency, when reading or writing fields of shared objects [The Art of Multiprocessor Programming. Maurice Herlihy, Nir Shavit, 2008, pp.61.] */ private AtomicInteger[] level; private AtomicInteger[] victim; private int n; /** * Constructor for Filter lock * * @param n thread count */ public Filter(int n) { this.n = n; level = new AtomicInteger[n]; victim = new AtomicInteger[n]; for (int i = 0; i < n; i++) { level[i] = new AtomicInteger(); victim[i] = new AtomicInteger(); } } /** * Acquires the lock. */ @Override public void lock() { int me = ConcurrencyUtils.getCurrentThreadId(); for (int i = 1; i < n; i++) { level[me].set(i); victim[i].set(me); for (int k = 0; k < n; k++) { while ((k != me) && (level[k].get() >= i && victim[i].get() == me)) { //spin wait } } } } /** * Releases the lock. */ @Override public void unlock() { int me = ConcurrencyUtils.getCurrentThreadId(); level[me].set(0); } }

    面包店鎖定算法通過使用面包店中經常使用的分布式版本的數字分配機來維護先到先得的屬性:每個線程在門口取一個數字,然后等待,直到沒有嘗試使用更早編號的線程為止輸入[3]。

    面包店鎖的實現如下:

    /** * @author Furkan KAMACI */ public class Bakery extends AbstractDummyLock implements Lock { /* Due to Java Memory Model, int[] not used for level and victim variables. Java programming language does not guarantee linearizability, or even sequential consistency, when reading or writing fields of shared objects [The Art of Multiprocessor Programming. Maurice Herlihy, Nir Shavit, 2008, pp.61.] */ private AtomicBoolean[] flag; private AtomicInteger[] label; private int n; /** * Constructor for Bakery lock * * @param n thread count */ public Bakery(int n) { this.n = n; flag = new AtomicBoolean[n]; label = new AtomicInteger[n]; for (int i = 0; i < n; i++) { flag[i] = new AtomicBoolean(); label[i] = new AtomicInteger(); } } /** * Acquires the lock. */ @Override public void lock() { int i = ConcurrencyUtils.getCurrentThreadId(); flag[i].set(true); label[i].set(findMaximumElement(label) + 1); for (int k = 0; k < n; k++) { while ((k != i) && flag[k].get() && ((label[k].get() < label[i].get()) || ((label[k].get() == label[i].get()) && k < i))) { //spin wait } } } /** * Releases the lock. */ @Override public void unlock() { flag[ConcurrencyUtils.getCurrentThreadId()].set(false); } /** * Finds maximum element within and {@link java.util.concurrent.atomic.AtomicInteger} array * * @param elementArray element array * @return maximum element */ private int findMaximumElement(AtomicInteger[] elementArray) { int maxValue = Integer.MIN_VALUE; for (AtomicInteger element : elementArray) { if (element.get() > maxValue) { maxValue = element.get(); } } return maxValue; } }

    對于此類算法,應提供或使用從0或1開始并以一個增量遞增的線程id系統。 線程的名稱為此目的進行了適當設置。 還應該考慮:Java編程語言在讀取或寫入共享對象的字段時不能保證線性化,甚至不能保證順序一致性[4]。 因此,過濾器鎖的級別和受害變量,面包店鎖的標志和標簽變量定義為原子變量。 一方面,想要測試Java內存模型效果的人可以將該變量更改為int []和boolean []并使用兩個以上的線程運行算法。 然后,即使線程仍然存在,也可以看到該算法將針對Filter或Bakery掛起。

    為了測試算法性能,實現了一個自定義計數器類,該類具有getAndIncrement方法,如下所示:

    /** * gets and increments value up to a maximum number * * @return value before increment if it didn't exceed a defined maximum number. Otherwise returns maximum number. */ public long getAndIncrement() { long temp; lock.lock(); try { if (value >= maxNumber) { return value; } temp = value; value = temp + 1; } finally { lock.unlock(); } return temp; }

    公平測試多個應用程序配置存在最大的障礙。 考慮的是:有很多工作(將變量遞增到所需數量),并且在線程數量不同的情況下,完成它的速度有多快。 因此,為了進行比較,應該有一個“工作”平等。 此方法還使用該代碼段測試不必要的工作負載:

    if (value >= maxNumber) { return value; }

    比較多個線程時,一種計算線程的單位工作性能的方法(即,不設置最大障礙,在循環中迭代到最大數量,然后將最后一個值除以線程數量)。

    此配置用于性能比較:

    線程數 1,2,3,4,5,6,7,8
    重試計數 20
    最大人數 10000000


    這是包含標準誤差的結果圖表:

    首先,當您在Java中多次運行代碼塊時,會對代碼進行內部優化。 當算法多次運行并且將第一輸出與第二輸出進行比較時,可以看到此優化的效果。 因此,第一經過時間通常應大于第二行。 例如:

    currentTry = 0, threadCount = 1, maxNumber = 10000000, lockType = FILTER, elapsedTime = 500 (ms) currentTry = 1, threadCount = 1, maxNumber = 10000000, lockType = FILTER, elapsedTime = 433 (ms)

    結論

    從圖表中可以看出,“面包房鎖”比“過濾器鎖”要快,標準誤差也很小。 原因是篩選器鎖定的鎖定方法。 在Bakery Lock中,作為一種公平的方法,線程是一個一個地運行的,但在Filter Lock中,它們是相互計算的。 與其他Java相比,Java的ReentrantLock具有最佳的性能。

    另一方面,Filter Lock線性惡化,但Bakery和ReentrantLock卻沒有(當Lock Lock運行更多線程時,它可能具有線性圖形)。 更多的線程數并不意味著更少的經過時間。 由于創建和鎖定/解鎖線程,所以2個線程可能比1個線程差。 當線程數開始增加時,Bakery和ReentrantLock的經過時間會變得更好。 但是,當線程數持續增加時,它就會變得更糟。 原因是運行算法的測試計算機的真實核心編號。

    • 可以從此處下載用于在Java中實現過濾器和面包店鎖的源代碼: https : //github.com/kamaci/filbak
  • 多處理器編程的藝術。 莫里斯·赫里希(Maurice Herlihy),《尼爾·沙維特》,2008年,第31.-33頁。
  • 多處理器編程的藝術。 莫里斯·赫里希(Maurice Herlihy),尼爾·沙維特(Nir Shavit),2008年,第28頁。
  • 多處理器編程的藝術。 莫里斯·赫利希(Maurice Herlihy),《尼爾·沙維特》(Nir Shavit),2008年,第31頁。
  • 多處理器編程的藝術。 莫里斯·赫里希(Maurice Herlihy),尼爾·沙維特(Nir Shavit),2008年,第61頁。
  • 翻譯自: https://www.javacodegeeks.com/2015/05/implementing-filter-and-bakery-locks-in-java.html

    java面包屑實現

    總結

    以上是生活随笔為你收集整理的java面包屑实现_在Java中实现过滤器和面包店锁的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 免费观看污| 国产情侣小视频 | 国产18一19sex性护士 | 91免费看黄 | 爱情岛论坛自拍 | 椎名空在线 | 国产精品免费看片 | 91免费国产在线 | 欧美a级片视频 | 嫩草亚洲| 欧美亚洲自拍偷拍 | 99热网址 | 农村一级毛片 | 国产主播一区二区 | 欧美一区二区三区观看 | 日本xxxxxxxxx18| 久久中文字幕人妻 | 激情综合五月网 | 欧美另类综合 | 中文字幕国产一区二区 | 法国空姐在线观看视频 | 日韩欧美网址 | gogo人体做爰大胆视频 | 人妻夜夜爽天天爽三区麻豆av网站 | a级淫片 | 十八禁毛片 | 中文字幕一区二区三区在线观看 | 91精品人妻互换一区二区 | 97香蕉碰碰人妻国产欧美 | 欧美日韩国产色 | 亚洲射色| 亚洲一级黄色 | 美女喷液视频 | 黄色在线视频观看 | 亚洲精品免费观看 | 成人羞羞在线观看网站 | 亚洲伦理一区 | 亚洲欧美日韩精品永久在线 | 伊人成综合网 | 国产成人一区在线观看 | 91超碰在| 四虎影院污 | jizz欧美性20 | 国产又粗又长又硬免费视频 | 成人日韩视频 | 可以直接看的无码av | 国产成人一区二区 | 男人撒尿视频xvideos | 在线视频网站 | 京香julia在线观看 | 亚洲 在线 | 亚洲欧洲成人在线 | 久久av在线播放 | 久久久久综合 | 国产69精品一区二区 | 国产毛片欧美毛片久久久 | 国产亚洲精品美女久久久 | 国产农村妇女精品一二区 | 久久无码视频一区 | 久久亚洲av无码西西人体 | 亚洲一区二区免费 | 成人网免费看 | 国产精欧美一区二区三区白种人 | 亚洲一区视频在线 | 国产精品又黄又爽又色无遮挡 | 国产精品刺激 | 黄色录象片| 黑人精品无码一区二区三区AV | 亚洲超碰在线 | 国产成人综合在线 | 不卡av免费在线观看 | 四虎影视永久免费 | 欧美性色黄大片手机版 | 五月婷婷久久综合 | 青青草在线视频免费观看 | 99精品久久久久久久婷婷 | 亚洲国产精品成人av | 伊人春色网 | 日韩精品一区二区三区色欲av | 日本一二三不卡 | 色一情一乱一乱一区91av | 亚洲午夜精品一区二区三区 | 高清国产一区二区三区四区五区 | 亚洲国产综合久久 | 色视频网址 | 爱草在线视频 | 成人短视频在线播放 | 秋霞国产 | 男人天堂avav | 久久久久99精品成人片三人毛片 | 成人高清免费观看 | 婷婷色五 | 深夜福利影院 | 一区二区三区在线播放 | 免费看国产视频 | 麻豆传媒在线 | 久久综合久久鬼色 | 黄色网炮 | 国产毛片久久久久 |