网站建设群标签好写什么,宁波网站推广公司排名,ui设计做兼职的网站有哪些,企业网站改版新闻一、并发编程三大特性的定义和由来
并发编程这三大特性就是为了在多个线程交替执行任务的过程中保证线程安全性。
二、为什么会出现线程不安全的现象呢#xff1f;
接下来我们从这三个特性切入来介绍线程不安全的原因。
1.原子性#xff1a;
一组操作要么全部执行#…一、并发编程三大特性的定义和由来
并发编程这三大特性就是为了在多个线程交替执行任务的过程中保证线程安全性。
二、为什么会出现线程不安全的现象呢
接下来我们从这三个特性切入来介绍线程不安全的原因。
1.原子性
一组操作要么全部执行要么全部不执行执行过程中不能被中断。
Java并发编程中必然存在多个线程的交替执行因此不论采取何种线程调度算法都会涉及到线程的切换而在线程切换的过程中如果对某个共享变量的操作不是原子的就可能会导致脏读等各种数据混乱的问题造成线程不安全因此我们必须保证对共享变量操作的原子性防止数据混乱以保证线程安全。
如何保证原子性 通过 synchronized 关键字保证原子性。 通过 Lock保证原子性。 通过 CAS保证原子性。 2.可见性
一个线程修改了某个共享变量其他线程立即可以“感知到”。
从对Java内存模型的了解我们可以知道Java中每个线程对共享数据的修改都是在其工作内存中进行的而每个线程在其工作内存中对共享数据的修改并不会立即同步到主内存因此其他线程并不能立即“感知到”某个线程对共享数据的修改这样就会导致每个线程工作内存中同一个共享变量的值不一定相等即缓存不一致导致线程不安全。因此我们必须保证可见性以保证线程安全。
如何保证可见性 通过 volatile 关键字保证可见性。 通过 内存屏障保证可见性。 通过 synchronized 关键字保证可见性。 通过Lock保证可见性。 通过 final 关键字保证可见性 3.有序性
如果在本线程内观察所有操作都是有序的如果在一个线程中观察另一个线程所有的操作都是无序的。 程序执行的顺序按照代码的先后顺序执行。JVM 存在指令重排所以存在有序性问题。 为了提高性能编译器和处理器可能会在满足数据依赖性的条件下对操作进行重新排序即在单线程环境中对指令的重排序并不影响执行结果在单线程环境下这种重排序不会有什么问题因为执行结果总是正确的但是在多线程环境下就会出现问题。
如 a1;a*2这两个操作不能交换顺序一旦交换会影响程序的执行结果。
如何保证有序性 通过 volatile 关键字保证有序性。 通过 内存屏障保证有序性。 通过 synchronized关键字保证有序性。 通过Lock保证有序性。 三、总结一下
之所以会出现并发编程的三大特性就是因为在提升程序性能的同时需要保证安全性而原子性、可见性、有序性这三大特性可以认为是线程安全的等价概念我们需要通过一些机制来保证这三大特性也就是保证线程安全。
原子性一次或多次操作在执行期间不被其他线程影响
可见性当一个线程在工作内存修改了变量其他线程能立刻知道
有序性JVM对指令的优化会让指令执行顺序改变有序性是禁止指令重排