共计 1603 个字符,预计需要花费 5 分钟才能阅读完成。
前言
还记得你第一次遇到「线程平安」这个词的时候吗?
我第一次遇到线程平安这个词是在学习多线程并发操作的时候,看到人家文章里呈现这个词,还有说各种线程平安的类,然而一开始并不了解线程平安是什么意思,也没去深究线程怎么是平安的?怎么是不平安的?只是脑子里接管了这么一个词。
线程平安是多线程编程时的计算机程序代码中的一个概念。在领有共享数据的多条线程并行执行的程序中,线程平安的代码会通过同步机制保障各个线程都能够失常且正确的执行,不会呈现数据净化等意外状况。——《百度百科》
默认已学前置常识
- 过程:程序的一次执行的过程,是动静的,是 零碎进行资源分配 的根本单位。一个过程里能够有多个线程。
- 线程:是一个 零碎进行调度 的根本单位,是能独立运行的。
上面开始回炉重造!打好根底!
线程安不平安是怎么定义的?
先给出个问题,为什么有线程平安这个词?这个词是怎么来的?可能这里会有点懵,不过没事,我来答复。
在多线程的状况下,咱们会遇到这样一个问题,这里举例 A、B、C 三个线程,它们独特操作同一个资源(呐,这里同一个资源指的是,变量,办法这些,更精确的话,应该说是内存,毕竟值都是存储内存中的)。记住,前提是多线程,毕竟如果你单线程,就不可能不平安了,单线程间接安安全全!
这三个线程同时操作,就可能呈现这样的问题,比方举个具体的例子,经典例子,买票(老演员了)!啥票都行。
三个线程代表三个人,票的残余量对于这三个线程来说就是共享资源。
设票的残余量为 10,记 ticketSurplus = 10
。三人购票,那么必定须要对这个残余量进行减一操作的。
public void buy() {
ticketSurplus = ticketSurplus - 1;
System.out.println(ticketSurplus);
}
那么当初同时执行,就很大可能会呈现这样的状况,如图所示(假如这三个线程执行程序是 A、B、C,实际上程序是不确定的):
从下面能够看出,输入后果为:9,9,8
,而从上帝视角来看,显然是谬误的,因为两个人买了票,不能只减一张票的值,正确的后果应该为9,8,7
。
所以,在多线程并发的状况下,这就是所谓的「不平安」,即不能正确执行,后果呈现了凌乱(数据净化)。
线程平安?
所谓线程平安,就是指当并发状况下,也就是有多个线程操作同一个资源(具体的话,这里同一个资源能够看成下面例子中的 ticketSurplus,当然这个同一资源也不肯定只的是一个变量,也能够是某一个办法),能不能保障这个资源的一致性,如果任何时候都可能保障这种正确的操作后果,那么就能够说是线程平安的。
如何保障线程平安?
在学习操作系统的时候,咱们学习了过程治理的内容,其中就有个「进程同步」的概念,所谓进程同步,说简略点就是过程之间具备前后的执行关系。在并发的状况下,不同过程有不同制约关系,比方某些状况下咱们是须要 A 过程先执行,而后 B 过程再执行的,然而操作系统具备「异步性」,在并发的状况下,可能呈现 B 先执行,A 后执行了,这显然不是咱们想要的,所以如果不制约,不管制过程的同步,就会呈现下面说的状况。
当然,除了「同步」这个词,还有一个词——「互斥」,互斥也是用于管制过程之间关系的。
同步:实现某种工作,须要过程之间的执行程序有先后顺序,互相协调工作。
互斥:一个过程进入临界区拜访临界资源,那么剩下的过程就须要进行期待,只有当它退出临界区,才容许下一个过程拜访。
在 Java 中,咱们能够通过 synchronized 关键字来保障临界区的同步互斥,当然还有其余的锁也能够实现同步互斥,进而保障多线程运行的平安。
总的来说,在多线程的状况下,通过加锁的形式保障线程平安。
最初的最初
由自己程度所限,不免有谬误以及不足之处,屏幕前的靓仔靓女们
如有发现,恳请指出!
最初,谢谢你看到这里,谢谢你认真对待我的致力,心愿这篇博客对你有所帮忙!
你轻轻地点了个赞,那将在我的心里世界削减一颗亮堂而夺目的星!