java多线程(二)并发的基本概念

一、 概述:

  • 下面我们思考一个问题,为什么会出现多线程这个概念呢?
    因为cpu的架构导致,目前主流的cpu x86和RAM为串行,也就是说流水性的工作形式,
    程序在cpu中运行时,会以一种形式进入任务队列等待被宠幸的一个过程。

二、共享内存

  • 主要参照java的(The Java® LanguageSpecificationJava SE 12 Edition)
  • 共享内存介绍:
1、Memory that can be shared between threads is called shared memory or heapmemory.
文档中提及到在线程中共享的内存被称为共享内存,在java的内存模型中,heap也就是堆内存。
2、All instance fields, static fields, and array elements are stored in heap memory
java中的所有引用类型字段,静态字段,和数组元素都是存储在堆中的。
3、Local variables (§14.4), 
   formal method parameters (§8.4.1), 
   and exception handler parameters (§14.20) 
   are never shared between threads and are unaffected by the memory model.
   而对于线程间不共享的内存,文档中也介绍了对于局部变量,方法参数和异常对象是不受
   java内存模型影响的。
4、数据竞争:
Two accesses to (reads of or writes to) the same variable are said to be conflicting if at least 
one of the accesses is a write.
可见当不同的线程对同一块内存,换言之同一个变量进行操作,并且其中的包含写操作时,就会
造成线程不安全,也就是数据竞争的关系。

二、线程的内部动作和程序顺序

1、An inter-thread action is an action performed by one thread that can be detected ordirectly
     influenced by another thread.
     //一个线程能被其他线程检测到或者直接对某个线程造成影响的动作。
    eg:  1、线程对某个变量的读写操作;
           2、同步动作:
                 volatile读写操作;
                 加锁或者解锁的动作;
                 The (synthetic) first and last action of a thread.
                 Actions that start a thread or detect that a thread has terminated (Thread的start()和Islive方法)
2、我们知道程序是从上而下的运行的。所以说程序的顺序的一致性是一个强有力的保证,如果不存在数据
      竞争,也就单线程的情况下,程序运行的顺序和编码人员书写的顺序保持一致。

三、线程的同步顺序(Synchronization Order)

如果数据存在竞争的关系,java规范中定义了一些同步的顺序来保证一致性;
1、An unlock action on monitor m synchronizes-with all subsequent lock actions on m 
对于同一把锁来说,如果同时多个线程去获取锁,那么总是只有一个线程可以获得锁,其他的线程在一个
尝试获得锁的状态而进行等待,只有获得锁的线程释放了锁,其他线程才有机会去获得锁。
2、A write to a volatile variable v (§8.3.1.4) synchronizes-with all subsequent reads of v by any thread 
对于一个volatile写操作,只有写操作完成时,其他线程的读操作才能进来,可以理解为内存屏障的功能。
3、An action that starts a thread synchronizes-with the first action in the thread it starts.
平时会思考线程的start方法和run方法有什么区别,其实只有start方法可以真正的向jvm启动线程,而run方法
是启动线程以后,jvm的一个回调方法,所以start方法必定先于run方法执行。
4、The write of the default value (zero, false, or null) to each variablesynchronizes-with the first action 
     in every thread.
 我们也可以思考一个问题,对于java来说,线程是读不到对象初始化开始到完成的中间状态的,所以保证
 对象在初始化完成后,线程进行访问。
 5、The final action in a thread T1 synchronizes-with any action in another thread T2 that detects that T1 has terminated.
 线程a是不能得知,线程b从启动到完成的中间状态的,线程a可以在线程b执行完成以后检测到。

你可能感兴趣的:(java多线程(二)并发的基本概念)