在 java 程序中怎么保证多线程的运行安全?

讲解人:王君  日期:10.1

两个java文件比较代码内容 两个java文件怎么运行_多线程怎么保证数据安全




线程的定义:

线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。Java虚拟机允许程序同时运行多个执行线程。

多线程:

在单个程序中可以同时运行多个不同的线程,执行不同的任务。

线程安全:

多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他操作,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的。

线程安全在以下三个方面体现:



① 原子性:

原子性是指操作是不可分的。其表现在于对于共享变量的某些操作,应该是不可分的,必须连续完成。例如a++,对于共享变量a的操作,实际上会执行三个步骤,1.读取变量a的值  2.a的值+1  3.将值赋予变量a 。这三个操作中任何一个操作过程中,a的值被人篡改,那么都会出现我们不希望出现的结果。所以我们必须保证这是原子性的。Java中的锁的机制解决了原子性的问题。提供互斥访问,同一时刻只能有一个线程对数据进行操作,(atomic,synchronized)。

② 可见性:

可见性是值一个线程对共享变量的修改,对于另一个线程来说是否是可以看到的。Java线程通信是通过共享内存的方式进行通信的,而我们又知道,为了加快执行的速度,线程一般是不会直接操作内存的,而是操作缓存。

③ 有序性:

一个线程观察其他线程中的指令执行顺序,由于指令重排序,该观察结果一般杂乱无序,(happens-before原则)。Java内存模型具有先天的有序性,不通过任何手段,就能得到保证的有序性,称为happens-before原则。如果两个操作的执行顺序无法从本原则推测出来,虚拟机将可随意地对其进行重排序。Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。


两个java文件比较代码内容 两个java文件怎么运行_idea中java文件怎么运行_02