java中的 java.util.concurrent.locks.ReentrantLock類的使用方式


實現了lock的類為:ReentrantLock

接口的方式解釋:

lock()方法為獲取鎖對象,如果未獲取到鎖就一直獲取鎖。

trylock():為布爾值,返回是否獲取到了鎖,如果沒有獲取到鎖則返回false,如果獲取到了則返回true

tryLock(long timeout, TimeUnit unit):表示在指定的時間內獲取鎖,如果未獲取到,則返回false,否則返回true

unlock():為釋放鎖,使其他線程有機會執行。

lockInterruptibly():表示獲取鎖,如果線程被中斷則拋出異常。

例如代碼實例:

package TestThread.ThreadLockDemo;

import java.util.concurrent.locks.ReentrantLock;

public class TestLock {
	public static void main(String[] args) {
		ReentrantLock lock = new ReentrantLock();// 初始化lock對象
		Test2 test2 = new Test2("蘋果", 100);// 初始化蘋果的數量
		Test1 test1 = new Test1(lock, 10, test2);// 初始化線程對象
		Thread t1 = new Thread(test1, "線程1");// 創建線程
		Thread t2 = new Thread(test1, "線程2");
		Thread t3 = new Thread(test1, "線程3");
		t1.start();// 啟動線程
		t2.start();
		t3.start();
	}
}

class Test1 implements Runnable {
	private int count;
	private ReentrantLock lock;
	private Test2 test2;

	public Test1(ReentrantLock lock, int count, Test2 test2) {
		this.lock = lock;
		this.count = count;
		this.test2 = test2;
	}

	@Override
	public void run() {
		lock.lock();// 枷鎖
		try {
			test2.DiscountApple(count);
		} catch (Exception e) {
			System.out.print("調用賣蘋果的方法發生異常!");
		} finally {
			lock.unlock();// 解鎖
		}
	}
}

class Test2 {
	private String name;
	int count;

	/**
	 * @param name蘋果的名字
	 * @param count初始化蘋果的數量
	 */
	public Test2(String name, int count) {
		this.name = name;
		this.count = count;
	}

	/**
	 * * @author 作者 E-mail:
	 * 
	 * @date 創建時間:2017年3月24日 下午1:13:14
	 * @version 1.0
	 * @parameter
	 * @since
	 * @return
	 */
	public void DiscountApple(int discount) {
		this.count = this.count - discount;
		System.out.println(Thread.currentThread().getName() + ":蘋果的數量為:" + this.count + ",賣掉了" + discount);
	}
}

實例結果:

 trylock()方法的使用演示:

 

package TestThread.ThreadLockDemo;

import java.util.concurrent.locks.ReentrantLock;

public class TestLock {
	public static void main(String[] args) {
		ReentrantLock lock = new ReentrantLock();// 初始化lock對象
		Test2 test2 = new Test2("蘋果", 100);// 初始化蘋果的數量
		Test1 test1 = new Test1(lock, 10, test2);// 初始化線程對象
		Thread t1 = new Thread(test1, "線程1");// 創建線程
		Thread t2 = new Thread(test1, "線程2");
		Thread t3 = new Thread(test1, "線程3");
		t1.start();// 啟動線程
		t2.start();
		t3.start();
	}
}

class Test1 implements Runnable {
	private int count;
	private ReentrantLock lock;
	private Test2 test2;

	public Test1(ReentrantLock lock, int count, Test2 test2) {
		this.lock = lock;
		this.count = count;
		this.test2 = test2;
	}

	@Override
	public void run() {
		if (lock.tryLock()) {
			// lock.lock();// 枷鎖
			try {
				test2.DiscountApple(count);
			} catch (Exception e) {
				System.out.print("調用賣蘋果的方法發生異常!");
			} finally {
				lock.unlock();// 解鎖
			}
		} else {
			System.out.println(Thread.currentThread().getName() + "未獲取到鎖");
		}
	}
}

class Test2 {
	private String name;
	int count;

	/**
	 * @param name蘋果的名字
	 * @param count初始化蘋果的數量
	 */
	public Test2(String name, int count) {
		this.name = name;
		this.count = count;
	}

	/**
	 * * @author 作者 E-mail:
	 * 
	 * @date 創建時間:2017年3月24日 下午1:13:14
	 * @version 1.0
	 * @parameter
	 * @since
	 * @return
	 */
	public void DiscountApple(int discount) {
		this.count = this.count - discount;
		System.out.println(Thread.currentThread().getName() + ":蘋果的數量為:" + this.count + ",賣掉了" + discount);
	}
}

測試結果為:

 

 

unlock()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM