マルチスレッドロックとリードライトロックReadWriteLock


JDK1.5の後に別のロック方式ロックが提供される.Lockインプリメンテーションは、synchronizedメソッドおよび文を用いて得られるよりも広範なロック動作を提供する.このインプリメンテーションは、より柔軟な構造を可能にし、大きな属性を有することができ、複数の関連するConditionオブジェクトをサポートすることができる.
ロックは、複数のスレッドが共有リソースにアクセスすることを制御するツールです.通常、ロックは共有リソースへの独占アクセスを提供します.ロックは一度に1つのスレッドしか取得できません.共有リソースへのすべてのアクセスは、まずロックを取得する必要があります.ただし、一部のロックでは、ReadWriteLockなどの共有リソースへの同時アクセスが可能になる場合があります.synchronizedメソッドまたは文の使用は、各オブジェクトに関連する暗黙的なモニタ・ロックへのアクセスを提供するが、すべてのロックの取得および解放を1つのブロック構造に強制する.複数のロックが取得された場合、それらは逆の順序で解放され、ロックが取得された場合と同じ語法範囲内ですべてのロックを解放しなければならない.
ロックがロックされた後、ロックを解除するために検索する必要があります.
 Lock l = ...; 
     l.lock();
     try {
         // access the resource protected by this lock
     } finally {
         l.unlock();
     }
 

synchronizedは次のように書き換えることができます.
package andy.thread.test;

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

/**
 * @author Zhang,Tianyou
 * @version 2014 11 8   11:30:10
 */

public class ThreadLockTest {

	public static void main(String[] args) {

		A a = new A();

		new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

					a.printfA(Thread.currentThread().getName()
							+ "hello, my is A");
				}

			}
		}).start();

		new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(10);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}

					a.printfA(Thread.currentThread().getName()
							+ "hello, my is B");
				}

			}
		}).start();

	}

	static class A {
		//  Lock 
		Lock lock = new ReentrantLock();

		public void printfA(String name) {

			lock.lock();//  lock 

			try {
				for (int i = 0; i < name.length(); i++) {
					System.out.print(name.charAt(i));
				}

				System.out.println();
			} finally {

				lock.unlock();//    
			}

		}
	}

}

ロックには、ReadWriteLockもあります. は、複数のreaderスレッドによって同時に保持され得る2   は独占です. 
ReadWriteLock rwl = new ReentrantReadWriteLock();
一、リードロック操作
    rwl.readLock().lock();
   rwl.readLock().unlock();
二、書き込みロック操作
    rwl.writeLock().lock();
   rwl.writeLock().unlock();
読み書きを実現するには、次のようにします.
  
package andy.thread.test;

import java.util.Random;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * @author Zhang,Tianyou
 * @version 2014 11 8   11:44:01
 */

public class ReadWriteLockTest {

	public static void main(String[] args) {

		final A a = new A();
		for (int i = 0; i < 3; i++) {
			new Thread() {
				public void run() {
					while (true) {
						a.get();
					}
				}

			}.start();

			new Thread() {
				public void run() {
					while (true) {
						a.put(new Random().nextInt(10000));
					}
				}

			}.start();
		}
	}

}

class A {
	private Object data = null;//  , , 。
	ReadWriteLock rwl = new ReentrantReadWriteLock();

	public void get() {
		rwl.readLock().lock();
		try {
			System.out.println(Thread.currentThread().getName()
					+ " be ready to read data!");
			Thread.sleep((long) (Math.random() * 1000));
			System.out.println(Thread.currentThread().getName()
					+ "have read data :" + data);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			rwl.readLock().unlock();
		}
	}

	public void put(Object data) {

		rwl.writeLock().lock();
		try {
			System.out.println(Thread.currentThread().getName()
					+ " be ready to write data!");
			Thread.sleep((long) (Math.random() * 1000));
			this.data = data;
			System.out.println(Thread.currentThread().getName()
					+ " have write data: " + data);
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			rwl.writeLock().unlock();
		}

	}
}

実行効果は次のとおりです.
Thread-0 be ready to read data!
Thread-4 be ready to read data!
Thread-2 be ready to read data!
Thread-0have read data :null
Thread-2have read data :null
Thread-4have read data :null
Thread-1 be ready to write data!
Thread-1 have write data: 5730
Thread-1 be ready to write data!
Thread-1 have write data: 7997
Thread-1 be ready to write data!
Thread-1 have write data: 2306
Thread-1 be ready to write data!
Thread-1 have write data: 8944
Thread-1 be ready to write data!
Thread-1 have write data: 8039
Thread-1 be ready to write data!
Thread-1 have write data: 6844
Thread-1 be ready to write data!
Thread-1 have write data: 2969
Thread-1 be ready to write data!