⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 criticalsection.java

📁 180个针对Java初学者的简单实例180个针对Java初学者的简单实例180个针对Java初学者的简单实例
💻 JAVA
字号:
//用某一块的同步代替对整个方法的同步.
//用个安全线程保护一个类不安全线程.
import java.util.*;
class Pair { // 线程不安全的.
	private int x, y;
	public Pair(int x, int y) {
		this.x = x;
		this.y = y;
	}
	public Pair() { this(0, 0); }
	public int getX() { return x; }
	public int getY() { return y; }
	public void incrementX() { x++; }
	public void incrementY() { y++; }
	public String toString() {
		return "x: " + x + ", y: " + y;
	}
	class PairValuesNotEqualException
	extends RuntimeException {
		public PairValuesNotEqualException() {
			super("这一对值不相等: " + Pair.this);
		}
	}
	// 两个变量必须相等.
	public void checkState() {
		if(x != y)
			throw new PairValuesNotEqualException();
	}
}
//保护内部线程的安全
abstract class PairManager {
	protected Pair p = new Pair();
	private List storage = new ArrayList();
	public synchronized Pair getPair() {
		// 做一个备份来保护原线程的安全.
		return new Pair(p.getX(), p.getY());
	}
	protected void store() { storage.add(getPair()); }
	// 一个模板方法.
	public abstract void doTask();
}
	//同步整个方法.
class PairManager1 extends PairManager {
	public synchronized void doTask() {
		p.incrementX();
		p.incrementY();
		store();
	}
}
//用临界区
class PairManager2 extends PairManager {
	public void doTask() {
		synchronized(this) {
			p.incrementX();
			p.incrementY();
		}
		store();
	}
}
class PairManipulator extends Thread {
	private PairManager pm;
	private int checkCounter = 0;
	private class PairChecker extends Thread {
		PairChecker() { start(); }
		public void run() {
			while(true) {
				checkCounter++;
				pm.getPair().checkState();
			}
		}
	}
	public PairManipulator(PairManager pm) {
		this.pm = pm;
		start();
		new PairChecker();
	}
	public void run() {
		while(true) {
			pm.doTask();
		}
	}
	public String toString() {
		return "一对数: " + pm.getPair() +
			" 检查 = " + checkCounter;
	}
}
public class CriticalSection {
	public static void main(String[] args) {
		//测试两种不同的方法.
		final PairManipulator
		pm1 = new PairManipulator(new PairManager1()),
		pm2 = new PairManipulator(new PairManager2());
		new Timer(true).schedule(new TimerTask() {
			public void run() {
				System.out.println("pm1: " + pm1);
				System.out.println("pm2: " + pm2);
				System.exit(0);
			}
			}, 500); // 500毫秒后开始运行.
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -