• Java线程: 第二章 多线程编程的目标与挑战(一)


    2.1 串行、并发与并行

      串行:ABC

      并发:A

            B

          C

      并行:A

         B

         C

    2.2 竞态

     2.2.1

      竞态是指计算的正确性依赖于时间顺序或者线程的交错

      竞态往往伴随着Dirty Read问题,即线程读取到一个过时的数据,Lost Update问题,即一个线程对数据所做的更新没有体现在后续对其他数据的读取上。 

     2.2.2 竞态的模式与竞态产生的条件

      竞态模式:read-modify-wirte(读-改-写),check-then-act(检查而后行动)。

      使用synchronize关键字规避竞态:

    public class A{
        private short sequence = -1;
    
        public synchronized short nextSequence(){
            if(sequeue >= 999)
                sequeue = 0;
            else
                sequeue++;
            return sequeue;
        }
    }

      synchronize关键字使其修饰的方法在任一时刻只能被一个线程执行。

    2.3 线程安全性

      线程的安全问题概括来说包括3个方面:原子性,可见性,有序性。

    2.4 原子性

       原子操作是多线程环境下的一个概念,它是针对访问共享变量的操作而言的。原子操作的“不可分割”包括以下两层含义:

      (1)读、写某个共享变量的操作从其执行线程以外的线程来看,该操作要么已经执行结束,要么尚未发生,即其他线程不会“看到”该操作执行了部分的中间结果。

      (2)访问同一组共享变量的原子操作是不能够被交错的。

      

      实现原子性的方法:

      (1)利用Lock。  

      (2)利用处理器提供专门的CAS(Compare-and-Swap)。

      Java中,long和double以外的任何变量的写操作都是原子操作,但是Java规定对于volatile修饰的long/double型变量的写操作具有原子性。

      然而,volatile只能保证变量写操作的原子性,并不能保障其他操作的原子性。 

  • 相关阅读:
    03、Jenkins相关概念
    02、Jenkins安装部署
    01、Jenkins简介
    10.ansible 利用playbook部署LAMP环境
    09.ansilbe利用playbook部署LNMP环境
    08.编译安装httpd
    python入门到放弃(五)-基本数据类型之list列表
    python入门到放弃(四)-基本数据类型之str字符串
    python入门到放弃(三)-基本数据类型之int整数和bool值
    CentOS7.5源码编译安装mysql5.7.29
  • 原文地址:https://www.cnblogs.com/tiandiou/p/9676218.html
Copyright © 2020-2023  润新知