课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
线程安全性问题对于程序员来说是需要重点关注的问题之一,而今天我们就通过案例分析来了解一下,线程安全性的概念。
1、引起线程切换的几种方式
线程间的切换一般是操作系统层面需要考虑的问题,那么引起线程上下文切换有哪几种方式呢?或者说线程切换有哪几种诱因呢?主要有下面几种引起上下文切换的方式
当前正在执行的任务完成,系统的CPU正常调度下一个需要运行的线程
当前正在执行的任务遇到I/O等阻塞操作,线程调度器挂起此任务,继续调度下一个任务。
多个任务并发抢占锁资源,当前任务没有获得锁资源,被线程调度器挂起,继续调度下一个任务。
用户的代码挂起当前任务,比如线程执行sleep方法,让出CPU。
使用硬件中断的方式引起上下文切换
2、线程安全性
在Java中,要实现线程安全性,必须要正确的使用线程和锁,但是这些只是满足线程安全的一种方式,要编写正确无误的线程安全的代码,其核心就是对状态访问操作进行管理。重要的就是共享(Shared)的和可变(Mutable)的状态。只有共享和可变的变量才会出现问题,私有变量不会出现问题,参考程序计数器。
对象的状态可以理解为存储在实例变量或者静态变量中的数据,共享意味着某个变量可以被多个线程同时访问、可变意味着变量在生命周期内会发生变化。一个变量是否是线程安全的,取决于它是否被多个线程访问。要使变量能够被安全访问,必须通过同步机制来对变量进行修饰。
如果不采用同步机制的话,那么就要避免多线程对共享变量的访问,主要有下面两种方式
不要在多线程之间共享变量
将共享变量置为不可变的
我们说了这么多次线程安全性,那么什么是线程安全性呢?
3、什么是线程安全性
多个线程可以同时安全调用的代码称为线程安全的,如果一段代码是安全的,那么这段代码就不存在竞态条件。仅仅当多个线程共享资源时,才会出现竞态条件。
根据上面的探讨,我们可以得出一个简单的结论:当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的。
单线程就是一个线程数量为1的多线程,单线程一定是线程安全的。读取某个变量的值不会产生安全性问题,因为不管读取多少次,这个变量的值都不会被修改。
【免责声明】:本内容转载于网络,转载目的在于传递信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。更多内容请在707945861群中学习了解。