/**
* PairManager是实现了线程安全的类,它将线程不安全的Pair类
* 置于其内部,是的Pair被保护起来
* @author Administrator
*/
abstract class PairManager{
protected Pair p = new Pair();
private List<Object> storage = new ArrayList<Object>()
public synchronized Pair getPair(){
return new Pair(p.getX(),p.getY());
}
protected void store(){
storage.add(getPair());
}
public abstract void doTask();
}
class PairMangerMethod extends PairManager{
@Override
public synchronized void doTask() {
p.incrementX();
p.incrementY();
store();
}
}/**
* 使用临界区,也就是同步块了
* @author Administrator
*/
class PairManagerCriticalSetion extends PairManager{
@Override
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();
}
}
@Override
public String toString() {
return "PairManipulator [pm=" + pm.getPair() + ", checkCounter=" + checkCounter
+ "]";
}
}
public class CriticalSection {
public static void main(String[] args) {
final PairManipulator
pm1 = new PairManipulator(new PairMangerMethod()),
pm2 = new PairManipulator(new PairManagerCriticalSetion());
new Timer(true).schedule(new TimerTask() {
@Override
public void run() {
System.out.println("pm1:" + pm1);
System.out.println("pm2:" + pm2);
System.exit(0);
}
}, 1000);
}
}
* PairManager是实现了线程安全的类,它将线程不安全的Pair类
* 置于其内部,是的Pair被保护起来
* @author Administrator
*/
abstract class PairManager{
protected Pair p = new Pair();
private List<Object> storage = new ArrayList<Object>()
public synchronized Pair getPair(){
return new Pair(p.getX(),p.getY());
}
protected void store(){
storage.add(getPair());
}
public abstract void doTask();
}
class PairMangerMethod extends PairManager{
@Override
public synchronized void doTask() {
p.incrementX();
p.incrementY();
store();
}
}/**
* 使用临界区,也就是同步块了
* @author Administrator
*/
class PairManagerCriticalSetion extends PairManager{
@Override
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();
}
}
@Override
public String toString() {
return "PairManipulator [pm=" + pm.getPair() + ", checkCounter=" + checkCounter
+ "]";
}
}
public class CriticalSection {
public static void main(String[] args) {
final PairManipulator
pm1 = new PairManipulator(new PairMangerMethod()),
pm2 = new PairManipulator(new PairManagerCriticalSetion());
new Timer(true).schedule(new TimerTask() {
@Override
public void run() {
System.out.println("pm1:" + pm1);
System.out.println("pm2:" + pm2);
System.exit(0);
}
}, 1000);
}
}
结果如下:
pm1:PairManipulator [pm=Pair [x=727345, y=727345], checkCounter=696350]
pm2:PairManipulator [pm=Pair [x=631430, y=631430], checkCounter=1234099]
pm2:PairManipulator [pm=Pair [x=631430, y=631430], checkCounter=1234099]
代码里Pair类是线程不安全的,PairManage类里包含了Pair对象,而获取Pair对象数据的getPair方法,它是用到了同步标记,那么线程不安全的Pair对象就被线程安全的PairManage类保护起来了。