zoukankan      html  css  js  c++  java
  • Java 并发之线程安全

    写线程安全的代码,说白了就是管理一个类的共享的、可变的状态。只要有多于 1 个线程对类的状态进行写入,那么就必须用同步来协调这多个线程对状态的访问。对于一个没有状态的类来说(简单的理解就是只有方法没有成员变量,不储存值),它永远都是安全的。而对于有状态的类来说,就要保持其原子性来保证安全。

    在多线程环境下,一种可能的风险就是 check-then-act (竞争条件的一种),就是 check 的时候条件满足,然后系统状态被别的线程改变了,这时候当前线程不知道 then act, 然后错了。比如用 lazy initialization 就可能出现这种状况,为了避免这种情况,可以把成员变量使用 java.util.concurrent.atomic 包中的原子变量,但是对于包中没有的原子类型,这时候可以考虑对程序加锁。

    Java 的 Synchronized 块是强制原子性的内部锁,是一种互斥锁。Synchronized 块包括 锁 和代码块两个部分,大概长这样:

    synchronized(lock) {
        // 代码块
    }

     

    内部锁是可重入的(Reentrancy), 意思就是,同一个线程可以获取它自己占有的锁,而其他的线程不能。

    为了避免竞争条件,每个共享的可变变量都需要同一个唯一确定的锁来保护。

    通常来说,简单的并发逻辑和性能是互斥的。耗时的操作,比如网络或者控制台 I/O, 很难快速完成就不要占有锁了

  • 相关阅读:
    蓝桥杯-带分数
    蓝桥杯-分红酒
    蓝桥杯-猜算式
    hdu2045不容易系列之(3)—— LELE的RPG难题
    蓝桥杯-奇怪的比赛
    linux应用之perl环境的安装(centos)
    linux应用之php开发环境lamp搭建(centos)
    linux应用之yum命令详解
    linux应用之用户管理相关命令
    linux应用之mysql数据库指定版本的yum安装(centos)
  • 原文地址:https://www.cnblogs.com/vivizhyy/p/3394866.html
Copyright © 2011-2022 走看看