前记:全篇以java多线程为例
1.线程安全与不安全
线程安全:就是当多线程访问时,采用加锁的机制;即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程存取操作完成之后,其他线程才允许访问。
线程不安全:就是不提供数据访问时的数据保护,多个线程能够同时操作某个数据,从而出现数据不一致或者数据污染的情况。
对于线程不安全的问题,一般会使用synchronized关键字加锁,进行排他性控制(同步控制)。
2.线程安全工作原理
由于多线程共享同一进程的存储空间,jvm中有个main memory对象,每个线程也有自己的working memory,一个线程对于一个变量variable进行操作的时候,都需要在自己的working memory里创建一个copy,操作完后,再写入main memory。当多个线程操作同一个变量variable,就可能出现互相竞争,操作顺序不可控,导致不可预知的结果。而是用了synchronized关键字就在在代码段里定义了一个同步访问控制块,在这个块上建立了一个monitor监控对象,然后通过这个加锁,解锁来实现同步控制。
例如:
class TestMain2 extends Thread{
private static AppleList appleList= new AppleList();
@Override
public void run(){
synchronized (appleList){//加锁
if (appleList.isFull()){ //操作非线程安全的集合对象
System.out.println(this.getId() + ",篮子已满,无法装填,可以歇一歇了" );
}
else{
appleList.pushApple(); //操作非线程安全的集合对象 System.out.println(this.getId() + ",生产了一个,c="+ appleList.getCount() );
}
}//自动解锁
}
}
3.线程安全thread-safe的集合对象:
Vector,HashTable,StringBuffer
4.非线程安全集合对象
ArryList,LinkedList,HashMap,HashSet,TreeMap,StringBulider
閱讀更多 銀行小馬農的日常 的文章