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

歡迎訪問 生活随笔!

生活随笔

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

java

java中同步组件_Java并发编程(自定义同步组件)

發(fā)布時間:2023/12/9 java 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java中同步组件_Java并发编程(自定义同步组件) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

并發(fā)包結(jié)構(gòu)圖:

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

業(yè)務(wù)要求:

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

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

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

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

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

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

* 保證同步器的共享式同步狀態(tài)的獲取與釋放方法得以執(zhí)行。

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

* 數(shù)為2,這樣可以設(shè)置初始狀態(tài)status為2,當一個線程進行獲取,status減1,該線程釋放,則

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

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

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

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

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

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);

}

//共享式同步狀態(tài)的獲取。

public int tryAcquireShared(int reduceCount) {

for(;;) { //自旋

int current = getState();

int newCount = current - reduceCount;

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

return newCount;

}

}

}

//共享式同步狀態(tài)釋放.

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方法相同, 但是該方法響應(yīng)中段.

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();

}

}

}

總結(jié)

以上是生活随笔為你收集整理的java中同步组件_Java并发编程(自定义同步组件)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。