1、Java的线程安全
关于Java中 线程安全的问题,首先需要去知道, 什么是线程安全?为什么会出现线程安全?及如何保证线程安全,线程不安全又会怎样等一系列问题?
什么是线程安全
ps:首先需要知道线程和进程的区别,及各自的意义
-
线程安全是指:
当多个线程同时访问同一个对象时,(如果不用考虑这些线程在运行是环境下的调度和交替执行,也不需要额外的同步,或者在调用方进行任何其他协调操作) 调用这个对象的行为都可以获取到正确的结果,那就称这个对象是线程安全的 -
Java中的线程安全
当涉及线程安全时,前提一定是多个线程存在对于共享数据访问时,在书中对于线程安全,从线程安全的程度来分类:
1.不可变
2. 绝对线程安全
3. 相对线程安全
4. 线程兼容
5. 线程独立 -
不可变 : 在Java语言中, 不可变对象【 Immutable】一定是线程安全的(为什么呢?后面会解答)—如,final 关键字所带来的可见性
譬如: 在Java类中的,java.lang.String;当使用者调用其subString (),repalce(),concat(),这些方法都不会影响其原来的值。只会返回一个new构造的字符串对象;java.lang.Number中的部分子类,Long,Double,BIgIntrger,BigDecimal 等数据类型,还有枚举类型 -
绝对线程安全 : 举个栗子,java.util.Vector 是一个线程安全的容器,他的add(),get(),size().等方法都是会被synochronized修饰的,这样已经具备了内存模型的三个特性,但是当我们试用其方法时,不在额外的做些同步措施,也还是会出现线程不安全的问题,那如果他需要做的绝对的线程安全,必须在调用其方法时,额外采取一定的同步措施,来保证绝对的线程安全
-
线程兼容 :是指对象本身不安全,但是可以通过调用端正确的使用同步的手段来保证对象在并发 环境下,达到线程安全。就像我们通常说的这个来是线程不安全的
-
线程对立 : 是指不管是调用端采取了哪一种同步措施,都无法在多并发的情况下使用它,如Thread类中的suspend() 和resume() 方法,当这两个线程共享/持有一个线程对象是,目标线程就会出现死锁现象,也正是由于这个,这两个方法已被废弃。 比如System.setIn() 和 Sysytem.setOut()
结语
关于Java的内存模型,内存模型的特性,下一章节会讲。博文中一些概念来自于第三版《深入理解Java虚拟机》
[本文链接]:https://editor.csdn.net/md?articleId=106459683