Java中實現線程同步的三種方法


實現同步的三種方法

多線程共享數據時,會發生線程不安全的情況,多線程共享數據必須同步。
實現同步的三種方法:

  1. 使用同步代碼塊
  2. 使用同步方法
  3. 使用互斥鎖ReetrantLock(更靈活的代碼控制)

代碼示例:

import java.util.concurrent.locks.ReentrantLock;


public class SyncThreadDemo {

	public static void main(String[] args) {
		MyRunnable mr = new MyRunnable();

		new Thread(mr).start();
		new Thread(mr).start();
	}

}

class MyRunnable implements Runnable {

	private int tickts = 10;

	@Override
	public void run() {

		for (int i = 0; i < 100; i++) {
//			if (tickts > 0) {
			// 方法一:使用同步代碼塊
//				synchronized (this) {
//					System.out.println("第" + (tickts--) + "張票售出");
//					try {
//						Thread.sleep(100);
//					} catch (InterruptedException e) {
//						e.printStackTrace();
//					}
//				}
//			}
			// 方法二:使用同步方法達到線程安全
			saleTickts();
		
			// 方法三:使用ReentrantLock,更加靈活,可以加入判斷,在特定的情況下釋放鎖
			saleTickts2();
		}// for
	}

	// 同步方法:同步的是當前對象
	private synchronized void saleTickts() {
		if (tickts > 0) {
			System.out.println("第" + (tickts--) + "張票售出");
			try {
				Thread.sleep(100);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}// saleTickts

	ReentrantLock lock = new ReentrantLock();

	// 方法三:使用ReentrantLock,更加靈活,可以加入判斷,在特定的情況下釋放鎖
	private void saleTickts2() {
		lock.lock();
		try {
			if (tickts > 0) {
				System.out.println("第" + (tickts--) + "張票售出");
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			// 保證鎖一定會被釋放,不會出現死鎖情況
		} finally {
			lock.unlock();// 釋放鎖
		}
	}// saleTickts2
}


免責聲明!

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



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