技术开发 频道

JAVA线程:如何解决资源共享冲突(下)

 

 
/**
*  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]

   代码里Pair类是线程不安全的,PairManage类里包含了Pair对象,而获取Pair对象数据的getPair方法,它是用到了同步标记,那么线程不安全的Pair对象就被线程安全的PairManage类保护起来了。

0
相关文章