前言还记得你第一次遇到“线程安全”这个词是什么时候吗?第一次遇到线程安全这个词是在学习多线程并发操作的时候。在其他文章看到这个词出现,还有各种线程安全的类,但是一开始没明白线程安全是什么意思,没有深入探讨线程是如何安全的?怎么会不安全呢?脑子里刚收到这么一句话。当使用多线程编程时,线程安全是计算机程序代码中的一个概念。在一个由多个线程并行执行并共享数据的程序中,线程安全的代码会通过同步机制保证每个线程都能正常正确执行,不会出现数据污染等事故。——《百度百科》默认学习预知过程:程序一次性执行的过程是动态的,是系统分配资源的基本单位。一个进程中可以有多个线程。线程:是一个系统进行调度的基本单元,可以独立运行。让我们开始装修吧!打好基础!线程安全是如何定义的?先问一个问题,为什么会有线程安全这个词?这个词从何而来?也许这里有点混乱,但没关系,我会回答的。在多线程的情况下,我们会遇到这样的问题。这里以三个线程A、B、C为例,它们共同操作同一个资源(嗯,这里的同一个资源指的是变量,方法等,更准确的话应该说是内存,毕竟值是保存在内存中的)。记住,前提是多线程。毕竟,如果你是单线程,是不可能不安全的。单线程直接安全!这三个线程同时运行,可能会出现这样的问题,比如具体例子,经典例子,买票(老演员)!任何票都可以。三个线程代表三个人,剩下的票数是这三个线程的共享资源。设门票剩余数量为10,记录ticketSurplus=10。如果三个人买票,那么剩余数量必须减一。publicvoidbuy(){ticketSurplus=ticketSurplus-1;System.out.println(ticketSurplus);}现在是同时执行的,很有可能会出现这样的情况,如图(假设这三个线程的执行顺序是A,B,C、其实顺序是不确定的):从上面可以看出,输出结果是:9,9,8,但是从上帝的角度来看,显然是错误的,因为两个人买票,你不能只需减去一张票的价值,正确的结果应该是9、8、7。所以,在多线程并发的情况下,这就是所谓的“不安全”,也就是不能正确执行,结果就是混乱(数据污染)。线程安全?所谓线程安全是指在并发的情况下,即多个线程操作同一个资源(具体来说,这里的同一个资源可以看成是上面例子中的ticketSurplus,当然同一个资源不一定只是一个变量,或者某个方法),这个资源的一致性能不能保证,如果任何时候都能保证正确的操作结果,那么就可以说是线程安全的。如何保证线程安全?在学习操作系统的时候,我们学习了进程管理的内容,其中就有一个“进程同步”的概念。在并发的情况下,不同的进程有不同的约束。比如有些情况下,我们需要进程A先执行,进程B再执行,但是操作系统有“异步性”。B先执行,A后执行。这显然不是我们想要的,所以如果我们不限制或者控制进程的同步,就会出现上面说的情况。当然,除了“同步”这个词之外,还有一个词——“互斥”,也是用来控制进程之间的关系的。同步:为了完成某个任务,进程之间的执行顺序需要有先后顺序,相互协调。互斥:当一个进程进入临界区访问临界资源时,其余进程需要等待。只有退出临界区,才能允许下一个进程访问。在Java中,我们可以使用synchronized关键字来保证临界区的同步互斥。当然还有其他的锁也可以实现同步互斥,从而保证多线程运行的安全。一般来说,在多线程的情况下,线程安全是通过锁来保证的。最后一篇受限于本人水平,难免有错误和不足之处。如果你发现了什么,请指出!最后,感谢您阅读本文,感谢您认真对待我的努力,希望这篇博客对您有所帮助!你轻轻竖起大拇指,那会为我心中的世界增添一颗璀璨耀眼的星!
