您的位置 首页 java

深入理解JVM-你真的理解线程安全吗?

1 真的理解 线程 安全吗?

我们在学习或者工作过程中一定会经常遇到 线程安全 与不安全的问题,我们通常理解的线程安全大多是 多线程 环境下xxx是线程不安全的,比如 HashMap 是线程不安全的,HashTable是线程安全的,那么到底是为什么安全或者不安全,具体是指的什么

大部分学习过程中一种是遇到了才知道或者听别人说的多了,另一种是应付面试,我面试了很多人新人,大多是草草的看一下概念,那么今天我们就一起从 jvm 底层了解什么是线程安全或不安全,是针对什么来讲的,高并发环境,如果保证线程安全,本文基于《深入理解 java 虚拟机》的理解,将我们对线程安全的认知引入一个正确的方向,对于线程安全实现的细节,后面会持续更新

2 正确理解线程安全

线程安全被表示为多个线程共享的数据的访问规则,两个关键字多线程和共享数据,再深入一点就是多个线程访问共享变量时,线程操作的是工作内存中保存的主内存的对象副本(使用到的字段等),普通成员变量内存不可见,也就是主内存的值被其中一个线程刷新后,其他线程的不可见的,即使是 volatile 关键字修饰,如果结果依赖当前值也会出现线程不安全的情况,即然这样,jvm根据线程安全的强度大概分为以下五类

2.1不可变

关键字final修饰的共享变量,如 String 类型对象,调用的方法最后构建新的对象并返回,原来的值是不改变的

2.2绝对线程安全

目前没有绝对线程安全的实现,一些api或者类所谓的线程安全也只是在常规的场景下,比如java.util.Vector类的add和remove方法是同步的,创建一个类变量 Vector ,如果开多个线程同时对集合进行remove和get,同样会角标异常,因为存在多个线程同时操作两个方法的情况,所以说java不存在绝对线程安全,所以我们如果再被问到xx个类是不是线程安全的,比如HashTable,千万不要直接说是线程安全的了,因为和我举等Vector的例子是一样的,所谓的线程安全除了类本身做了线程兼容,还需要我们在使用的时候根据需要再做兼容处理

2.3相对线程安全

根据业务需要,通过同步实现就是相对线程安全,比如通过 Synchronized 实现线程同步,事实上,java里都可除了特定的final修饰的变量,基本都是相对线程安全

2.4线程兼容

线程兼容,我理解就是对相对线程安全的实现

2.5线程对立

多线程环境下无法使用的代码,如System.setIn()、System.setOut()

文章来源:智云一二三科技

文章标题:深入理解JVM-你真的理解线程安全吗?

文章地址:https://www.zhihuclub.com/181143.shtml

关于作者: 智云科技

热门文章

网站地图