java中同步組件_Java并發編程(自定義同步組件)

并發包結構圖:

0818b9ca8b590ca3270a3433284dd417.png

編寫一個自定義同步組件來加深對同步器的理解

業務要求:

* 編寫一個自定義同步組件來加深對同步器的理解。

* 設計一個同步工具:該工具在同一時刻,只允許至多兩個線程同時訪問,超過兩個線程的

* 訪問將被阻塞,我們將這個同步工具命名為TwinsLock。

* 首先,確定訪問模式。TwinsLock能夠在同一時刻支持多個線程的訪問,這顯然是共享式

* 訪問,因此,需要使用同步器提供的acquireShared(int args)方法等和Shared相關的方法,這就要

* 求TwinsLock必須重寫tryAcquireShared(int args)方法和tryReleaseShared(int args)方法,這樣才能

* 保證同步器的共享式同步狀態的獲取與釋放方法得以執行。

* 其次,定義資源數。TwinsLock在同一時刻允許至多兩個線程的同時訪問,表明同步資源

* 數為2,這樣可以設置初始狀態status為2,當一個線程進行獲取,status減1,該線程釋放,則

* status加1,狀態的合法范圍為0、1和2,其中0表示當前已經有兩個線程獲取了同步資源,此時

* 再有其他線程對同步狀態進行獲取,該線程只能被阻塞。在同步狀態變更時,需要使用

* compareAndSet(int expect,int update)方法做原子性保障。

* 最后,組合自定義同步器。前面的章節提到,自定義同步組件通過組合自定義同步器來完

* 成同步功能,一般情況下自定義同步器會被定義為自定義同步組件的內部類

import java.util.concurrent.TimeUnit;

import java.util.concurrent.locks.AbstractQueuedSynchronizer;

import java.util.concurrent.locks.Condition;

import java.util.concurrent.locks.Lock;

public class TwinsLock implements Lock {

private final Sync sync = new Sync(2);

private static final class Sync extends AbstractQueuedSynchronizer {

Sync(int count) {

if(count <= 0) {

throw new IllegalArgumentException("count must large zero!");

}

setState(count);

}

//共享式同步狀態的獲取。

public int tryAcquireShared(int reduceCount) {

for(;;) { //自旋

int current = getState();

int newCount = current - reduceCount;

if(newCount < 0 || compareAndSetState(current, newCount)) {

return newCount;

}

}

}

//共享式同步狀態釋放.

public boolean tryReleaseShared(int returnCount) {

for(;;) {//自旋.

int current = getState();

int newCount = current + returnCount;

if(compareAndSetState(current, newCount)) {

return true;

}

}

}

final ConditionObject newCondition() {

return new ConditionObject();

}

}

//共享式獲取

public void lock() {

sync.acquireShared(1);

}

public void lockInterruptibly() throws InterruptedException {

//和acquire方法相同, 但是該方法響應中段.

sync.acquireInterruptibly(1);

}

//如果返回大于等于0表示獲取成功。

public boolean tryLock() {

return sync.tryAcquireShared(1) >= 0;

}

public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {

return sync.tryAcquireSharedNanos(1, unit.toNanos(time));

}

//釋放所資源

public void unlock() {

sync.releaseShared(1);

}

public Condition newCondition() {

return sync.newCondition();

}

}

import javafx.concurrent.Worker;

import java.util.concurrent.locks.Lock;

public class TwinsLockTest {

public static void main(String argc[]){

final Lock lock = new TwinsLock();

class Worker extends Thread{

public void run() {

while(true) {

lock.lock();

try {

System.out.println(Thread.currentThread().getName());

Thread.sleep(1500);

} catch (InterruptedException e) {

System.out.println("interruptException!");

}

finally {

lock.unlock();

break;

}

}

}

}

for(int i = 0; i < 10; i++) {

Worker worker = new Worker();

//worker.setDaemon(true);

worker.start();

}

//每間隔一秒鐘打印一個空行.

for(int i = 0; i <10; i++) {

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

System.out.println();

}

}

}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/394035.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/394035.shtml
英文地址,請注明出處:http://en.pswp.cn/news/394035.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

maven學習資料

maven學習資料maven學習教程&#xff1a;What、How、Whyhttp://www.flyne.org/article/167Maven 那點事兒 https://my.oschina.net/huangyong/blog/194583項目管理工具&#xff1a;Maven教程http://www.flyne.org/article/884轉載于:https://www.cnblogs.com/zhao1949/p/634641…

leetcode127. 單詞接龍(bfs)

給定兩個單詞&#xff08;beginWord 和 endWord&#xff09;和一個字典&#xff0c;找到從 beginWord 到 endWord 的最短轉換序列的長度。轉換需遵循如下規則&#xff1a; 每次轉換只能改變一個字母。 轉換過程中的中間單詞必須是字典中的單詞。 說明: 如果不存在這樣的轉換序…

算法之旅 | 快速排序法

HTML5學堂-碼匠&#xff1a;前幾期“算法之旅”跟大家分享了冒泡排序法和選擇排序法&#xff0c;它們都屬于時間復雜度為O(n^2)的“慢”排序。今天跟大家分享多種排序算法里使用較廣泛&#xff0c;速度快的排序算法—— 快速排序法 [ 平均時間復雜度為O (n logn) ]。Tips 1&…

springmvd接收參數問題

問題描述&#xff1a; 好久不寫博客了&#xff0c;今天遇到一個問題&#xff0c;那就是post請求時&#xff0c;參數接收不到&#xff0c;當時我很納悶&#xff0c;看代碼&#xff1a; 就是這樣幾個參數&#xff0c;我使用postman請求時無法獲取參數&#xff1a; 報錯信息&#…

figma下載_如何在Figma中創建逼真的3D對象

figma下載by Gbolahan Taoheed Fawale通過Gbolahan Taoheed Fawale 如何在Figma中創建逼真的3D對象 (How to create realistic 3D objects in Figma) Prior to using Figma, I used Adobe Illustrator for most of my designs (like logos, mockups, illustrations, and so on…

OpenGL中的二維編程——從簡單的矩形開始

一、OpenGL的組成 圖元函數&#xff08;primitive function&#xff09;指定要生成屏幕圖像的圖元。包括兩種類型&#xff1a;可以在二維、三維或者四維空間進行定義的幾何圖元&#xff0c;如多邊形&#xff1b;離散實體&#xff1b;位圖。屬性函數&#xff08;attribute funct…

圓與平面的接觸面積_如果一個絕對的圓放在絕對的平面上,接觸面是不是無限小?...

這種問題其實并不難解答&#xff1a;如果你真的能找到一個絕對的圓還有一個絕對平的平面上&#xff0c;并且保證放上去之后圓和平面不會有任何變化&#xff0c;那么接觸面就可以是無限小&#xff01;如果不能&#xff0c;很抱歉&#xff0c;接觸面很顯然就不會是無限小&#xf…

leetocde1129. 顏色交替的最短路徑(bfs)

在一個有向圖中&#xff0c;節點分別標記為 0, 1, …, n-1。這個圖中的每條邊不是紅色就是藍色&#xff0c;且存在自環或平行邊。 red_edges 中的每一個 [i, j] 對表示從節點 i 到節點 j 的紅色有向邊。類似地&#xff0c;blue_edges 中的每一個 [i, j] 對表示從節點 i 到節點…

第38天:運算符、字符串對象常用方法

一、運算符 一元操作符 &#xff0c; --&#xff0c; &#xff0c; - 5 -6 邏輯操作符 !&#xff0c; &&&#xff0c; || 基本運算符 , -, *, /, % 關系操作符 >, <, >, <, , , !, ! 賦值 判斷 全等 條件操作符 &#xff08;三…

Redux Todos Example

此項目模板是使用Create React App構建的&#xff0c;它提供了一種簡單的方法來啟動React項目而無需構建配置。 使用Create-React-App構建的項目包括對ES6語法的支持&#xff0c;以及幾種非官方/尚未最終形式的Javascript語法 先看效果 這個例子可以幫助你深入理解在 Redux 中 …

有效電子郵件地址大全_如何優雅有效地處理介紹電子郵件

有效電子郵件地址大全by DJ Chung由DJ Chung 如何優雅有效地處理介紹電子郵件 (How to handle intro emails gracefully and effectively) 您想幫個忙時不想忘恩負義... (You don’t want to sound ungrateful when asking for a favor…) Let me tell you the story that ins…

notability錄音定位_Notability的一些使用技巧?

作為使用了一年Notability的考研狗 今天也來回答回答這個問題&#xff0c;希望可以給考研的同學一點點幫助。這個軟件的優點估計大家都知道&#xff0c;我在這里就不多說了。好吧&#xff0c;還有一個原因是我比較懶&#xff01;好了不多說廢話了&#xff0c;等會你們要打我了本…

python實現軟件的注冊功能(機器碼+注冊碼機制)

sklearn實戰-乳腺癌細胞數據挖掘 https://study.163.com/course/introduction.htm?courseId1005269003&utm_campaigncommission&utm_sourcecp-400000000398149&utm_mediumshare 一、前言&#xff1a;目的&#xff1a;完成已有python圖像處理工具的注冊功能功能&am…

leetcode1306. 跳躍游戲 III(bfs)

這里有一個非負整數數組 arr&#xff0c;你最開始位于該數組的起始下標 start 處。當你位于下標 i 處時&#xff0c;你可以跳到 i arr[i] 或者 i - arr[i]。 請你判斷自己是否能夠跳到對應元素值為 0 的 任一 下標處。 注意&#xff0c;不管是什么情況下&#xff0c;你都無法…

Win10 UWP開發系列:使用VS2015 Update2+ionic開發第一個Cordova App

原文:Win10 UWP開發系列&#xff1a;使用VS2015 Update2ionic開發第一個Cordova App安裝VS2015 Update2的過程是非常曲折的。還好經過不懈的努力&#xff0c;終于折騰成功了。 如果開發Cordova項目的話&#xff0c;推薦大家用一下ionic這個框架&#xff0c;效果還不錯。對于Cor…

vavr_使用Vavr在Java 8流中更好的異常處理

vavrby Rajasekar Elango由Rajasekar Elango In this post, I will provide tips for better exception handling in Java 8 streams using the Functional Java library Vavr.在這篇文章中&#xff0c;我將提供使用Functional Java庫Vavr在Java 8流中更好地處理異常的技巧。 …

Python-strace命令追蹤ssh操作

Python-strace命令追蹤ssh操作 通過strace 命令追蹤ssh的進程ID&#xff0c;記錄操作的命令[實際上是內核里面記錄的東西]&#xff0c;進行操作日志的Py解析達到效果 追蹤進程并寫入ssh操作到文件中 Ps: 此時機器A已經ssh登錄了機器B&#xff0c;取得它的ssh進程PID 機器A登錄后…

java h2 derby_嵌入式H2數據庫的Spring配置以進行測試

小編典典由于我不知道是否有任何工具可以檢查數據庫&#xff0c;我認為一個簡單的解決方案是使用支持HSQL&#xff0c;H2和Derby 的Spring嵌入式數據庫(3.1.x docs&#xff0c;current docs)。 。使用H2&#xff0c;你的xml配置如下所示&#xff1a;如果你更喜歡基于Java的配置…

基礎的python程序_Python程序入門

Python語法元素入門Python語法元素分析注釋注釋&#xff1a;程序員在代碼中加入的說明信息&#xff0c;不被計算機執行注釋的兩種方法&#xff1a;單行注釋以#開頭多行注釋以開頭和結尾# Here are the commentsThis is a multiline commerntused in Python縮進1個縮進 &#xf…

解決阿里云服務器磁盤報警

一般磁盤報警涉及到實際磁盤和inode文件索引節點 1.df -h檢查磁盤占用不高 2.df -i檢查inode文件索引節點有一個掛載目錄達到89%,里面有一個目錄產生大量的4k大的緩存文件,刪除該目錄下的文件解決: 刪除該目錄下小于4kb的文件 find /data/tmp -type f -size -4 -exec rm -rf {}…