并发概念

来源:互联网 发布:淘宝国产高达禁卖 编辑:程序博客网 时间:2024/06/06 13:03

线程安全

当多个线程访问某个类时,不管运行时环境采用何种调度方法或者这些线程将如何交替运行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类为线程安全的。

原子性

一组语句作为一个不可分割的单元被执行。任何一个执行同步代码块的线程,都不可能看到有其他线程正在执行由同一个锁保护的同步代码块。

竞态条件

当某个计算的正确性取决于多个线程的交替执行时序时,那么就会发生竞态条件。最常见的竞态条件类型就是“先检查后执行”操作,通过一个可能失效的观测结果来决定下一步的动作。

重入

当某个线程请求一个有其他线程持有的锁时,发出请求的线程会阻塞。如果某个线程试图获得一个由它自己持有的锁,那么这个请求就会成功。

public class Widget{     public synchronized void doSomething(){         ....     }}public class LoggingWi  dget extends Widget{     public synchonized void doSomething(){          System.out.println("calling something") ;           super.doSomething() ;      }}

volatile变量

当把变量申明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将改变量上的操作与其他内存操作一起重排序。因此在读取volatile类型的变量时总会返回最新写入的值。

发布和逸出

发布一个对象的意思是指,是对象能够在当前作用域之外的代码中使用。例如,将一个指向该对象的引用保存到其他代码可以访问的地方,或者在某一个非私有的方法中返回该引用,或者将引用传递到其他类的方法中。 当某个不该被发布的对象被发布时,这种情况称为逸出

线程封闭

  • Ad-hoc线程封闭: 维护线程封闭性的职责完全由程序实现来承担
  • 栈封闭: 在栈封闭中,只能通过局部变量才能访问对象。
  • ThreadLocal类: 这个值能使线程中的某个值与保存值的对象关联起来。

不变性

如果某个对象在被创建后其状态就不能被修改,那么这个对象就称为不可变对象。线程安全性是不可变对象的固有属性之一

当满足以下条件,对象才是不可变的

  • 对象创建后其状态不能修改
  • 对象所有域都是final类型
  • 对象是正确创建的(在对象创建期间,this引用没有逸出)
0 0
原创粉丝点击