线程安全/线程安全保护机制/框架(spring)如何保证线程安全/线程安全编码实战

                                      线程安全/线程安全保护机制/框架(spring)如何保证线程安全/线程安全编码实战

    随着硬件软件的发展,cpu多核心,多线程随着而生,在很多的请求中,一个请求就是一个线程,我们无时无刻处于多线程之中,因此下面我就说说一些对多线程的自我理解

    先理解一些名词吧,有利于后续的更深入理解

原子性:略

竞态条件:

当某个计算的正确性取决于多个线程的交替执行,那么存在竞态条件,数据竞争也是一种竞态,总之就是一段代码会被多线程执行的结果不可预测,那么存在竞态条件

复合操作:

当一个操作是需要原子性执行才能保证竞态条件不会发生,那个这样的操作就是一个复合操作,如i++(i是全局变量),他需要三个操作 读 ->赋值->写回,这三个操作在多线程下是竞态的,复合操作需要同步机制去保证数据安全

状态:

一个对象的可能出现的所有的可能性的集合,状态取决于可变全局对象,如类X有全局变量int a(1<=a<=2)和int b(1<=b<=2)

那么类 X至少有四种状态,因为a和b都有两种可能,那么组合起来就是四种,对象的状态取决于不确定的属性

可见性:

当一个值发生改变的时候,其他所有使用它的线程都会看到它的改变

发布溢出

当我们将一个全局变量被方法返回,导致每一个访问这个方法的线程都可以拿到这个全局变量,进而导致这个全局变量被多线程共同操作导致线程安全问题

public class A{

 B b = new B();

  public  synchronized B getB(){

        return b;

  }

}

每个访问getB方法的人都可以拿到b对象,b对象溢出,多线程共享

线程封闭/栈封闭/ThresdLocal/实例封闭

这四个概念其实意思差不多,就是让变量只能在一个线程内进行活动,那么它就绝对是线程安全的,就像局部变量,它对于每个方法都是新的一份,所以不存在共享,也就不存啊并发

单例

有且只有一个,当然也不存在并发

不变性与final

对于static final的对象,因为不会改变,所以没有并发安全问题

二、在实际项目中,我们的每一个访问就是一个线程,多线程无处不在,项目中如何保证线程安全

以springboot为例子

1采用单例,然后注入,在单例模式的类里面不要出现全局变量,就不会有线程安全问题

2对于常量,直接声明为 private static final String/integer...

3尽量不声明全局变量

4大量采用局部变量(线程隔离)

5预防对象逃逸

6使用threadlocal

7必要的时候使用锁,或者并发包,

 

 

 

 

 

 

 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值