线程初步理解

线程初步理解

1、线程

  线程会共享进程范围内的资源,同时,每一个线程也会有各自的程序计数器,栈,以及了局部变量。java

  线程有效下降了程序开发、维护成本,提高了复杂应用程序的性能,让系统能够更好地利用计算机资源,提升系统的处理能力,为用户界面提供更加灵敏的响应。编程

2、多线程的危险

  1. 安全性问题 :在多个线程不彻底同步的状况下,多个线程执行的顺序是不可预测的,那么不一样的执行顺序就可能带来极其糟糕的结果。
  2. 活跃性问题 :活跃性问题关注“某件正确的事情是否最终会发生”,有时候由于线程之间的相互等待,或者单线程的无限循环问题,就会引起活跃性问题。
  3. 性能问题 :线程总会带来额外的运营开销,若是这些开销过于大,会直接影响到系统的性能。

3、线程安全类

  • 定义
      如何定义一个类是线程安全的呢?最核心的问题在于正确性,在代码中无需进行额外的同步或者协同操做的状况下,不管有多少个线程使用这个类,不管环境以何种方式调度多线程,这个类总能表现出正确的行为,咱们就成这个类是线程安全的。安全

  • 无状态的对象必定是线程安全的
      由于无状态的线程不会影响到其余线程的状态,这个线程中的操做并不会影响到其余线程的执行,因此无状态的对象必定是线程安全的。多线程

  • 当一个无状态的对象增长一个状态时,若是这个状态彻底有线程安全的对象来管理,那么原来这个对象仍然是线程安全的。并发

4、竞争状态和竞争条件

  • 竞争状态
      在并发编程中,因为不恰当的执行时序而致使的结果的错误,这种状况叫作竞争状态性能

  • 竞争条件
      引起竞争状态的条件就是竞争状态的竞争条件atom

  • 原子操做
      原子操做即指某动做要不不完成,要不一次性完成,中间不会被打断或者干扰线程

  • 竞争条件“先检查后执行”
      "先检查后执行"是最多见的一种竞争条件。”先检查后执行”即先进行检查某状态,而后根据这种状态来决定下面发生的动做,这种方式不具备原子性,那么这种依赖的状态就可能在动做发生以前发生变化,最终致使结果的错误。总结来讲,“先检查后执行”依赖的是不可靠的状态条件,由于可能会发生错误。对象

5、解决竞争状态

1.单状态状况-使用java.util.concurrent.atomic下的原子变量

  • 这些原子变量的增长减小等运算均可以保持原子性,那么就会保证某个状态是线程安全的。

2.复合状态的状况

  • 若是再使用第一种方法,虽然多个变量各自能够保持线程安全,可是多个变量之间的协同不是原子的操做。例如a变量和b变量有某种联系,a和b须要作同步的修改,那么修改的操做也必须是原子操做。于是第一种方法就失效了。
  • Java提供了一种内置锁的机制:同步代码块(Synchronized Block),这种机制能够保证某个过程是原子操做,从而保证了线程安全。

6、Java内置锁

1.同步代码块(Synchronized Block)

  1. Java的同步代码块有两部分组成,一部分是由锁保护的代码块,另外一部分是锁的对象。
    • 以synchronized修饰的方法就是由锁保护的代码块。
    • 这个方法所在的对象就是这个锁,静态方法的话,方法所在的class就是锁。
  2. 重入
    • Java内置锁是能够重入的,即同一线程能够对本身持有的锁进行反复的进入。实现方法是:锁是有计数器和持有者这两个变量,计数器默认为0,持有者为空,当有人访问锁时候,JVM会自增计数器,而且将持有者设置为锁的对象,只有当同一个线程再次访问这个锁的时候,线程还能够得到这个锁,而且计数器增长;退出后,释放锁,计数器减小。
  3. 同步代码块可能来性能问题,由于多个线程只能有一个来执行被锁定的方法,其余处于等待的过程,会出现性能缺失。
相关文章
相关标签/搜索