关于线程安全和非线程安全的几个问题

前记:全篇以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


分享到:


相關文章: