java 非线程安全_Java多线程(四)线程安全和非线程安全

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

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

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

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值