java线程安全问题及其解决方法

线程安全问题

主要原因是因为存在多条线程共同操作共享数据,同时cpu采用时间片方式调度线程,线程交替执行,导致程序的语义发生变化。

解决办法

java中主要有两种方式来结局:

  • 互斥同步
  • 非阻塞式同步
  • JDK1.5开始,提供java.util.concurrent.atomic包,这个包中的原子操作类提供了更为简单高效、线程安全的方式来更新一个变量的值,Atomic系列类原理都是CAS操作。

互斥同步(悲观锁)

互斥同步是指当存在多个线程操作共享数据时,需要保证同一时刻有且只有一个线程在操作共享数据,其他线程必须等待该线程处理完数据后再进行。
在Java中最基本的互斥同步就是synchronized,也就是说当一个共享数据被当前正在访问的线程加上互斥锁后,在同一个时刻,其他线程只能处于等待的状态,直到当前线程处理完毕释放该锁。
除了synchronized之外,我们还可以使用java.util.concurrent包下的ReentrantLock来实现同步。

synchronized的三种使用方式

  • 修饰普通的实例方法,对于普通的同步方法,锁式当前实例对象
  • 修饰静态方法,对于静态同步方法,锁式当前类的Class对象
  • 修饰代码块,对于同步方法块,锁是Synchronized配置的对象

非阻塞式同步(乐观锁)

互斥同步主要的问题就是进行线程阻塞和唤醒锁带来的性能问题,为了解决这性能问题,我们有另一种解决方案,当多个线程竞争某个共享数据时,没有获得锁的线程不会阻塞,而是不断的尝试去获取锁,直到成功为止。这种方案的原理就是使用循环CAS操作来实现。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值