Java多线程-线程安全问题

Posted 机械键盘papapa

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java多线程-线程安全问题相关的知识,希望对你有一定的参考价值。

什么是线程安全问题?

借用一位仁兄博客里的话:”如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是的。“


引发线程不安全的本质?

多个线程同时操作同一个数据。


异步和同步的概念

同步和异步的概念对于很多人来说是一个模糊的概念,是一种似乎只能意会不能言传的东西。其实我们的生活中存在着很多同步异步的例子。

比如:

你叫我去吃饭,我听到了就立刻和你去吃饭,如果我们有听到,你就会一直叫我,直到我听见和你一起去吃饭,这个过程叫同步;

异步过程指你叫我去吃饭,然后你就去吃饭了,而不管我是否和你一起去吃饭。而我得到消息后可能立即就走,也可能过段时间再走。

说的再简单点就是:

异步我在干活的时候,别人也在干,别人干活的时候,我也在干!

同步:我再干活的时候,别人不能干,别人干活的时候,我不能干!


解决线程不安全的方法

多线程都是异步的,而出现线程不安全的本质是多个线程操作了同一个对象,所以让线程安全的方法就是把多个线程操作同一个对象的操作给同步化,这样就不会出现线程不安全了。



同步代码块:

让这部分代码同步的方式。

synchronized (对象) {

//当前线程就持有了这个对象

}

对于这个对象的理解,某个线程一旦进入同步代码,会先判断这个对象是否被别的线程持有,一旦被别的线程持有,那么这个线程是无法进入这个同步代码块中的,只能等待;如果这个对象不被别的线程持有,那么这个线程可以持有这个对象并进入同步代码块。


很多人把这个对象叫做锁机制。可以理解为一段代码被一把锁开启,其他线程进入就会获取这把锁进入一个房子中,除非这个线程出来别的线程都是无法进入的,因为没有锁。当这个线程执行完同步代码块中的代码就可以从房子中出来,再把锁挂上,其他线程就能进入了。





线程安全问题演示视频:



使用同步代码块解决线程安全问题视频:







友情推荐:获取最近极客资讯,了解全球最黑科技,请关注--极客峰



以上是关于Java多线程-线程安全问题的主要内容,如果未能解决你的问题,请参考以下文章

Java多线程线程安全和非线程安全

Java多线程 2.线程安全

java多线程回顾3:线程安全

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

java多线程机制2(安全问题)

java多线程——多线程的安全问题