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都有关联、