自己已参加「新人创作礼」活动,一同敞开创作之路。

1. 什么是线程安全问题

线程安全问题便是多个线程同时关于某个同享资源的拜访,导致的原子性,可见性和有序性的问题,而这些问题会导致同享数据存在一个不可预测性,使得程序在履行进程中会呈现一些超过预期的一个结果

如何在不加锁的情况下解决线程安全问题

如何在不加锁的情况下解决线程安全问题

2. 处理线程安全问题的方法

一般情况下处理线程安全问题的方法是增加同步锁,常见的是像synchronzied,lock等等,由于导致线程安全问题的根本原因是多线程并行拜访。对同享资源加锁之后呢,多个线程在拜访这个资源的时分,必须要先获得锁,也便是先获得拜访资历,而同步锁的特征是在同一个时间只允许一个线程拜访这样一个资源,直到锁被释放,虽然这种方法,可以处理线程安全性的一个问题,但同时带来的是加锁和释放锁所带来的一个功能开销,由于加锁涉及用户空间和内核空间的一个转化以及上下文切换

3. 如安在不加锁处理线程安全问题

如安在功能和安全性之间去获得一个平衡,这就引出了一个无锁并发的概念,一般来说会有以下几种说法

  1. 通过自选锁(CAS),所谓自选锁是指线程在没有抢占的锁的情况下先自旋指定的次数,去测验获得锁

如何在不加锁的情况下解决线程安全问题

  1. 达观锁,给每个数据增加一个版本号,一旦数据发生变化,则去修正这个版本号,那在Java里面,有一个CAS的一个机制,去完结达观锁的一个功能
  2. 在程序设计中,尽量去减少同享对象的一个运用,从业务上去实现阻隔防止并发