搜文章
推荐 原创 视频 Java开发 iOS开发 前端开发 JavaScript开发 Android开发 PHP开发 数据库 开发工具 Python开发 Kotlin开发 Ruby开发 .NET开发 服务器运维 开放平台 架构师 大数据 云计算 人工智能 开发语言 其它开发
Lambda在线 > 独角兽小蓝 > 关于线程安全和非线程安全的几个问题

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

独角兽小蓝 2019-01-05

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


版权声明:本站内容全部来自于腾讯微信公众号,属第三方自助推荐收录。《关于线程安全和非线程安全的几个问题》的版权归原作者「独角兽小蓝」所有,文章言论观点不代表Lambda在线的观点, Lambda在线不承担任何法律责任。如需删除可联系QQ:516101458

文章来源: 阅读原文

相关阅读

关注独角兽小蓝微信公众号

独角兽小蓝微信公众号:bankcoder

独角兽小蓝

手机扫描上方二维码即可关注独角兽小蓝微信公众号

独角兽小蓝最新文章

精品公众号随机推荐