IE盒子

搜索
查看: 146|回复: 1

JAVA线程安全和锁优化(java中的线程安全)

[复制链接]

4

主题

6

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2023-1-17 12:20:57 | 显示全部楼层 |阅读模式
在软件发展的初期,程序都是以算法为核心。许多人会把数据和过程分别作为独立的部分来考虑。程序代表问题空间中的客体,程序代码用于处理这些数据。这种思维是直接站在计算机的角度去考虑问题的,因此称为面向过程的编程思想。与此相对应的是面相对象的思想。面向对象思想是站在现实世界的角度去考虑问题的。
现实世界与计算机世界中不可避免的存在一些差异。人们很难想象现实中的对象在一项工作进行期间会被不停的中断和切换,对象的属性可能在被中断期间被修改。而这些在计算机多线程环境下是十分正常的。在多线程高并发环境中,必须的让程序准确无误的运行,然后再考虑代码的高效。
线程安全:当多线程访问对象时,不需要考虑这些线程在运行时环境下的调度和执行,也不需要进行额外的同步,或者调用方法进行任何其他的协调操作,调用这个对象都可以得到正确的结果,则我们说这个对象是线程安全的。
java中的线程安全:我们讨论线程安全问题,是指多个线程之间存在数据共享问题。如果一段代码根本不和其他线程共享数据,则不存在线程安全问题。java中我们可以将各种操作共享的数据分为五种:1、不可变对象;2、绝对线程安全;3、相对线程安全;4、线程兼容;5、线程对立;
1、不可变对象:不可变对象一定是线程安全的,无论是对象的方法实现还是对象的调用者都不需要采取任何的线程安全措施。被final关键字修饰的属性或者对象。只要不可变对象被正确的构建出来(没有发生过this引用逃逸的情况),那多线程的访问数据安全性永远是可靠的。java语言中,如果共享数据是一个基本数据类型,在定义时只要使用final关键字修饰则可以保证线程安全性。如果共享数据是一个对象,则需要保证对象的行为不会对其状态产生任何影响才行。java.lang.String类的对象是不可变的,我们调用它的subString、replace、concat方法都不会影响它原来的值,只会返回一个新构造的字符串对象。
保证对象不影响数据状态的方法有很多种,比如说将对象中的状态声明为final,这样在构造函数之后它就是不可变的。比如说java.lang.Integer构造函数所示,他内部就是通过将变量定义为final来保障线程安全的。代码示例:



Integer类final状态保障线程安全

2、绝对的线程安全:不管运行环境如何,调用者都不需要额外的同步措施,在java中标注自己的线程安全的类,大多数都不是绝对线程安全的,举个例子,我们可以通过一个java中不是“绝对”线程安全的线程安全类来看看“绝对”的含义。



Vector不是绝对线程安全,多线程环境下也会报错


尽管这里的使用到的Vector的get、remove、size方法是线程安全的,但是这段代码放到多线程环境下仍然不是线程安全的,导致数组最终数组下标越界。如果要保障这段代码执行下去,最终代码不得不修改成如下图所示:



vector保证线程安全的方法

3、相对线程安全:相对的线程安全就是我们通常意义上的线程安全。它需要保障数据单独操作是线程安全的,我们在调用的时候不需要额外的保障措施。但对于一些特定顺序的连续调用,就可能需要在调用端使用额外的同步手段来保证调用的正确性。上面两段代码就是相对安全的明显案例。在java语言中,大部分的线程安全类都属于这种类型,比如说Vector、HashTable、Collections、SyncheonizedCollections方法包装的集合类等等。
4、线程兼容:指的是对象本身不是线程安全的,但可以通过调用端正确的使用同步手段保证对象在并发环境中使用。平常指的线程不安全就是指的这种情况。比如说ArrayList、HashMap等。
5、线程对立:指的是无论调用端是否采取了同步措施,都无法在多线程环境中并发使用的代码。由于java语言天生就有多线程特性,因此线程对立这种排斥多线程的代码在java中很少见。一个典型的线程对立的例子就是Thread类的suspend()、resume()方法。如果并发执行的话,无论调用是否进行了同步目标线程都存在死锁的风险。如果suspend中断的线程就是要执行resume的线程,那就肯定会产生死锁了。因此,suspend和resume方法被jdk声明废弃过时了。
回复

使用道具 举报

3

主题

5

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2025-6-12 17:57:38 | 显示全部楼层
鄙视楼下的顶帖没我快,哈哈
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表