Java多线程中线程安全与锁问题

本文探讨了线程安全的概念及其实现方式,强调了无状态对象的线程安全性,并详细解析了在并发环境中如何通过使用锁来保护可变状态变量的一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

线程安全

  1. 无状态的对象一定是线程安全的。
    • 大多数Servlet都是无状态的,从而极大地降低了实现Servlet线程安全性的复杂性。只有当Servlet在处理请求时需要保存一些信息时,才可能会产生线程安全问题。
  2. 要保持状态的一致性,就需要在单个原子操作中更新所有相关的状态变量。
  3. 并发环境中的原子性与事务应用程序中的原子性有着相同的含义—一组语句作为一个不可分割的单元被执行。
  4. 对于可能被多个线程同时访问的可变状态变量,在访问它的时候需要持有同一把锁,在这种情况下,称状态变量是由这个锁保护的。

锁问题

  1. 一个对象里面如果有多个synchronized方法,某一时刻内,只要一个线程去调用其中的一个synchronized方法了,其他的线程都只能等待,换句话说,某一个时刻内,只能有唯一一个线程去访问这些synchronized方法
  2. 锁的是当前对象this,被锁定后,其它的线程都不能进入到当前对象的其它的synchronized方法。普通方法和同步锁无关
  3. 所有的非静态同步方法用的都是同一把锁—实例对象本身(如果一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须等待获取锁的方法释放后才能获取锁,别的实例对象的非静态同步方法因为跟该实例对象的非静态同步方法用的是不同的锁,所以不需要等待该实例对象已获取锁的非静态同步方法释放锁就可以获取他们自己的锁)
  4. 所有的静态同步方法用的也是同一把锁—类对象本身(静态同步方法与非静态同步方法之间不会有竞态条件,但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放锁后才能获取锁,而不管是同一个实例对象的静态同步方法之间,还是不同的实例对象的静态同步方法之间,只要它们是一个类的实例对象!)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值