java解决并发问题_Java 并发问题详解(一)—— 并发问题的产生原因和应对措施...

线程安全是并发编程中的重要关注点,应该注意到的是,造成线程安全问题的主要诱因有一下两点:

1. 存在共享数据 (也称临界资源)

2. 存在多条线程共同操作共享数据

只用同时满足上面两个条件,才会引发线程安全问题。

因此,我们可以使用以下两种常用的加锁方式来解决线程安全问题:

当存在多个线程并发访问共享数据时,需要保证同一时刻有且只有一个线程在操作共享数据,其他线程必须等到这个线程结束了对共享数据的操作(访问)才可以进行对数据的操作(访问)。这种安排多线程访问共享数据的方案被称为互斥锁,即能达到互斥访问共享数据目的的锁,具体的就是,当一个线程访问一个共享数据时,该线程必须获得共享数据的互斥锁,这样在同一时刻,其他线程因为无法活得该共享数据的互斥锁,只能处于等待状态,直到当前线程操作完共享数据,释放了互斥锁,其他等待的线程才可以通过获得这个互斥锁来获得对共享数据的操作权利。

1. 在 Java 中,关键字 synchronized 可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作),同时我们还应该注意到 synchronized 另外一个重要的作用,synchronized 可保证一个线程的变化(主要是共享数据的变化)被其他线程所看到(保证可见性,完全可以替代 volatile 功能,但是 volatile 没有 synchronized 保证操作的原子性的特性),这点确实也是很重要的。

2. synchronized 属于隐式锁,即锁的持有与释放都是隐式的,我们无需干预,还有一种显式锁 Lock,即锁的持有和释放都必须由我们手动编写。在Java 1.5中,官方在concurrent并发包中加入了Lock接口,该接口中提供了 lock() 方法和 unLock() 方法对显式加锁和显式释放锁操作进行支持。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值