java并发编程_建立概念

在学习多线程编程时,相信大家会遇到好多概念类的东西,对于这些概念的不准确理解会导致后面越学越糊涂,现将学习过程中遇到的概念整理到这篇博客上,一来记录学习点滴,二来也加深理解,如果有理解不准确的地方,希望大家指出。

参考与并发编程网 http://ifeve.com/java-concurrency-thread-directory/

  • 临界区:临界区是一段代码,这段代码可能会导致竞态条件的发生,所谓竞态条件就是多个线程不同的执行顺序可能导致不同的结果,这样的情况就称存在竞态条件
  • 不可变性:对象没有提供可以改变该对象自身状态的接口,这样的对象就是不可变性的,也就是说,这样的对象是线程安全的。但如果这个线程被非线程安全的类引用,那这个线程安全的对象就会变为非线程安全的类,如下列代码所示
public class ImmutableValue{     //该类没有提供setValue()方法,就没有提供改变自身状态的接口,这样的类就是线程安全的
	private int value = 0;
                             
	public ImmutableValue(int value){
		this.value = value;
	}

	public int getValue(){
		return this.value;
	}
}
//这个类是非线程安全的,并且引用了不可变的对象,但它暴露了访问不可变对象的接口,即add()方法,这样原先线程安全的类对象(currentValue)就变得不安全了
public void Calculator{
	private ImmutableValue currentValue = null;

	public ImmutableValue getValue(){
		return currentValue;
	}

	public void setValue(ImmutableValue newValue){
		this.currentValue = newValue;
	}

	public void add(int newValue){
		this.currentValue = this.currentValue.add(newValue);
	}
}
  • 同步块: 被synchronized关键字修饰的代码块就叫做同步块,如下所示

synchronized(lock){

     your statement

}

  • 内置锁:上图中小括号中的lock对象引用就是一个内置锁,任何对象引用都可以作为内置锁。被同一个内置锁修饰的不同同步块或同步方法,(如同步块1和同步块2)在同一时刻,只能有一个线程访问,如下例所示,在线程a访问同步块1的时候,其他线程不能访问同步块2,因为这两个同步块都被同一个内置锁对象修饰(lock对象)
    1. 补充: 对于静态方法,它们的内置锁为它们所在类的 class 对象

//同步块1

synchronized(lock){

your statement1

}

//同步块2

synchronized(lock){

your statement2

}

  • 可见性:后一个线程拿到的值是前一个线程修改生效的值,这就称之为前一个线程对于共享变量的修改对于后一个线程来说是可见的。后一个线程看得到前一个线程做的修改
  • 饥饿:即某一个线程永远得不到机会来执行同步块中的代码,分为以下几种情形:
    1. 多个线程都在执行了wait方法,都处于等待的状态,一旦别的线程执行notify操作,总有那么一个倒霉等待线程总是轮不到唤醒它,导致该线程处于饥饿状态
    2. 等待线程执行的优先级比较低

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。