Single Threaded Execution

Single Threaded Execution 也称为 Critical  Section 临界区:危险区域 或者Critical Region 

Single Threaded Execution 是把视点放在运行的线程上所取的名称 

而Critical Session 或Critical Region 则是把视点放在执行的范围上所取的名称

 

 

/**

*Gate 类   这个是线程安全的

*/

public class Gate{
private int counter=0;
private String name="Nobody";
private String address="Nowhere";

public synchronized void pass(String name,String address){  //synchronized 
this.counter++;
this.name=name;
this.address=address;
check();
}
public synchronized String toString(){    //synchronized 
return "NO."+counter+":"+name+","+address;
}
private void check(){
if(name.charAt(0)!=address.charAt(0)){
System.out.println("******BROKEN****"+toString());
}
}
}

-------------------------------------------------------------

/**
* UserThread
*/
public class UserThread extends Thread{
private final Gate gate;
private final String myname;
private final String myaddress;
public UserThread(Gate gate,String myname,String myaddress){
this.gate=gate;
this.myname=myname;
this.myaddress=myaddress;
}
public void run(){
System.out.println(myname+"BEGIN");
while(true){
gate.pass(myname, myaddress);
}
}

}

---------------------------------------------

public class MainTest {

/**
* main
* */
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("Testing Gate");
Gate gate=new Gate();
new UserThread(gate,"AA","AAA").start();
new UserThread(gate,"BB","BBB").start();
new UserThread(gate,"CC","CCC").start();
}

}

 

之所以会显示BROKEN 是因为pass方法内的程序坑内会被多个线程穿插执行

synchronized方法,能够保证同时只有一个线程可以执行它

就是说 线程A执行pass方法的时候,线程B就不会调用pass方法,在线程A执行完pass方法之前,线程B会在pass方法的入口处被阻挡下,当线程A执行完pass方法后,将锁定解除线程B才可以开始执行pass方法

所以只要将pass方法生民成synchronized的方法,就绝对不会出现BROKEN 

而toString方法需要加上synchronized的理由,与check方法不加上synchronized的理由。。。。。。 

 

 

SafeMethod  从多个线层同时调用也不会发生问题的方法   (安全的方法,并不需要特别的处理)

UnsafeMethod 从多个线程同时调用会出问题,而需要加以防护的方法(不安全的方法 则是被多个线程同时执行,可能会使实例的状态产生矛盾的方法,所以必须加以防卫,使同时不能有多个线程同时执行这个方法)

 

 

 

---------------------------------------

单线程程序,并不需要使用Single Threaded Execution Pattern 因此 也不需要使用synchronized方法

即使使用也不会对程序的安全性造成危害,但是会多花时间,所以会使程序性能略微降低

会需要使用 SingleThreaded Execution Pattern 的情况 ,是在SharedResource的实例可能同时被多个线程访问的时候

就算是多线程程序,如果所有线程完全地独立运行也没有使用S E P的必要,这个状态称为线程互不干涉(interfere)

有些管理多线程的环境,会帮我们确保线程的独立性,这种情况下这个环境的用户就不必考虑需不需要使用single threaded EP的必要

在immutable pattern中,实例的状态不会改变,所以是不需要用到synchronized方法的一种 pattern

只有需要确保安全性的时候,才会需要使用 SingleThreaded Execution Pattern

java2的集合架构类多半并非线程安全。这是为了在不考虑安全性的时候,可以让程序的运行速度较高

所以用户需要考虑自己要用的类需不需要考虑线程安全再使用

 

 

-------------

线程安全的包装方法(Wrapper)用来让集合架构类可以线层安全地运行

synchronizedCollection方法

synchronizedList方法

synchronizedMap

synchronizedSet

synchronizedSortedMap

synchronizedSortedSet

 

临界区的大小与执行性能

一般来说SingleThreaded Execution Pattern 会使程序执行性能低落的原因有两个

获取锁定要花时间-----若见啥SharedResource参与者的数量,就能减少需要获取的锁定数,可以减少性能低落的幅度

线程冲突时必须等待----当线程A执行临界区内的操作时,其他要进入临界区额线程会被阻挡。这个状态称之为冲突(conflict)当冲突发生时,线程等待的时间就会使整个线程性能往下掉

-------尽可能缩小临街区范围,以减少出现线程冲突的机会,可抑制性能的降低

SingleThreaded Execution Pattern与多线程,并发性相关的许多Pattern都有关联、

 

posted @ 2014-11-05 19:04  By莫  阅读(197)  评论(0编辑  收藏  举报