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

Posted IT编程之路

tags:

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

Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题。多线程中的同步问题是学习多线程的重中之重。

多线程同步就会涉及到“线程安全”与“非线程安全”相关的技术点,“非线程安全”就是在多个线程对同一个对象中的实例变量进行并发访问时,产生的后果就是“脏读”,也就是取到的数据其实时被更改过的。“线程安全”就是已获得的实例变量的值是经过同步处理的,不会出现脏读的现象。

方法内的变量为线程安全的,“非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量,则不存在“非线程安全”问题,所得结果也就是‘线程安全’了。方法中的变量不存在非线程安全问题,永远都是线程安全的。这是方法内部的变量是私有的特性造成的。

实例变量为非线程安全的,如果多个线程共同访问1个对象中的实例变量,则有可能出现“非线程安全”问题。用线程访问的对象中如果有多个实例变量,则运行的结果有可能出现交叉的情况。如果对象仅有1个实例变量,则有坑出现覆盖的情况。

如何解决“非线程安全”问题?

简单的做方法就是在public void xxx(xxx)方法前加关键字synchronized即可。声明后该方法为同步方法,在两个线程访问同一个对象中的同步方法时一定是线程安全的。

两个线程分别访问同一个类的两个不同实例的相同名称的同步方法,效果为什么以异步的方式运行的?

由于创建了2两个业务对象,在系统中产生出2个锁,所以运行结果是异步的。根据描述可以知道关键字synchronized取得的锁都是对象锁,而不是把一段代码或方法当作锁,所以哪个线程先执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁lock,那么其他线程只能呈等待状态,前提是多个线程访问的是同一个对象。如果多个线程访问多个对象,则jvm会创建多个锁。


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

Java线程安全和非线程安全

java多线程之线程安全

python中的线程安全和非线程安全的区别

Java多线程总结之线程安全队列Queue

java多线程之队列

java是线程安全的吗