Semaphoreの使用-(マルチパス-マルチプロセッシング-マルチパス)と(マルチパス-シングルプロセッシング-マルチパス)


マルチパス-マルチプロセッシング-マルチパス
本実装の目標は,複数のスレッドが同時にタスクを処理できるようにすることであり,より具体的には,各スレッドが独自のタスクを処理していることである.
実験用のプロジェクトを作成します.MoreToOne_1,クラスサービス.JAvaコードは次のとおりです.
package com.yc.semephore_4_1;

import java.util.concurrent.Semaphore;

public class Service {
	private Semaphore semaphore = new Semaphore(3);
	
	public void testMore2One(){
		try {
			semaphore.acquire();
			System.out.println( Thread.currentThread().getName() + " ");
			
			for(int i = 0; i < 5; i ++){
				System.out.println( Thread.currentThread().getName() + " " + i);
			}
			
			System.out.println( Thread.currentThread().getName() + " ");
			semaphore.release();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

使用するスレッドクラスJAvaコードは次のとおりです.
package com.yc.semephore_4_1;

public class MyThread extends Thread{
	private Service service;
	
	public MyThread(Service service){
		this.service = service;
	}
	@Override
	public void run() {
		service.testMore2One();
	}

}
テストコードは次のとおりです.
package com.yc.semephore_4_1;

public class SemaphoreMoreToOneTest {
	public static void main(String[] args) {
		Service service = new Service();
		
		MyThread[] mts = new MyThread[4];
		for(int i = 0; i < mts.length; i ++){
			mts[i] = new MyThread(service);
			mts[i].start();
		}
	}
}	

テスト結果は次のとおりです.
Thread-0 
Thread-0 0
Thread-0 1
Thread-0 2
Thread-0 3
Thread-1 
Thread-0 4
Thread-0 
Thread-3 
Thread-3 0
Thread-2 
Thread-2 0
Thread-2 1
Thread-2 2
Thread-2 3
Thread-2 4
Thread-2 
Thread-1 0
Thread-1 1
Thread-1 2
Thread-1 3
Thread-1 4
Thread-1 
Thread-3 1
Thread-3 2
Thread-3 3
Thread-3 4
Thread-3 

マルチパス-単一処理-マルチパス上のサービス.JAvaは次のコードに変更されました(ロックを追加します):
package com.yc.semephore_4_1;

import java.util.concurrent.Semaphore;
import java.util.concurrent.locks.ReentrantLock;

public class Service {
	private Semaphore semaphore = new Semaphore(3);
	private ReentrantLock lock = new ReentrantLock();
	public void testMore2One(){
		try {
			semaphore.acquire();
			lock.lock();
			System.out.println( Thread.currentThread().getName() + " ");
			
			for(int i = 0; i < 5; i ++){
				System.out.println( Thread.currentThread().getName() + " " + i);
			}
			
			System.out.println( Thread.currentThread().getName() + " ");
			lock.unlock();
			semaphore.release();
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
}

テスト結果は次のとおりです.
Thread-0 
Thread-0 0
Thread-0 1
Thread-0 2
Thread-0 3
Thread-0 4
Thread-0 
Thread-1 
Thread-1 0
Thread-1 1
Thread-1 2
Thread-1 3
Thread-1 4
Thread-1 
Thread-2 
Thread-2 0
Thread-2 1
Thread-2 2
Thread-2 3
Thread-2 4
Thread-2 
Thread-3 
Thread-3 0
Thread-3 1
Thread-3 2
Thread-3 3
Thread-3 4
Thread-3 

前後の2回の結果を比較すると、鍵をかけた後、誰が先に準備して誰が先に終わるのか、つまり同期しているのか、もちろん誰が先に許可を得ているのか分からないことがあります.