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

参考与并发编程网 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. 等待线程执行的优先级比较低

java并发编程_建立概念的更多相关文章

  1. 1.1 Java并发编程的一些概念

    并发编程的一些概念 同步和异步 同步: 同步方法必须等到方法调用返回后,才能继续后继的行为.也就是说,同步方法执行时,如果没有返回,则后面的方法是执行不到的.同步方法调用,调用过程中可能出现阻塞和等待 ...

  2. java并发编程_基本模块构建

    读<java并发编程实战>第五章学习记录:该章节主要介绍一些并发编程中一些基本的构建模块.如并发容器和并发工具类(闭锁和栅栏)以及一些需要注意的情况 并发容器 1. ConcurrentH ...

  3. 【java并发编程实战】-----线程基本概念

    学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的"系统",需要自己好好总结.整理才能征服它.希望同仁们一起来学习 ...

  4. java并发编程基础概念

    本次内容主要讲进程和线程.CPU核心数和线程数.CPU时间片轮转机制.上下文切换,并行和并发的基本概念以及并发编程的好处和注意事项,为java并发编程打下扎实基础. 1.什么是进程和线程 1.1 进程 ...

  5. 原创】Java并发编程系列2:线程概念与基础操作

    [原创]Java并发编程系列2:线程概念与基础操作 伟大的理想只有经过忘我的斗争和牺牲才能胜利实现. 本篇为[Dali王的技术博客]Java并发编程系列第二篇,讲讲有关线程的那些事儿.主要内容是如下这 ...

  6. NO.001- 简说 Java 并发编程史

    这篇文章是Java并发编程思想系列的第一篇,主要从理解Java并发编程历史的原因和Java并发演进过程两部分,以极简地回溯并发编程的历史,帮助大家从历史这个角度去了解一门语言一个特性的演进.对历史理解 ...

  7. Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)

    Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...

  8. 【转】关于Java并发编程的总结和思考

    一.前言 就是想学习Java并发编程了,所以转载一下这篇认为还不错的博客~ 二.正文 编写优质的并发代码是一件难度极高的事情.Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的 ...

  9. 《Java并发编程的艺术》留给自己以后看的笔记

    <Java并发编程的艺术>这本书特别好,和<深入了解JAVA虚拟机>有一拼,建议做java的都看看,下面全部都是复制书中的部分内容,主要目的是做个笔记,方便以后遇到问题能找到. ...

随机推荐

  1. recovery编译汉化

    当BoardConfig.mk中定义了recovery的字体且为中文字体时,自动编译为中文版,否则编译为英文版 例如: BOARD_USE_CUSTOM_RECOVERY_FONT := \" ...

  2. SQL basic

    Function 从例子学习 drop function dbo.getWorkingDateCount; --getWorkingDateCount = functionName CREATE FU ...

  3. Xamarin devexpress datagrid 样式

    DevExpress的提供光与暗的内置,可以应用到主题GridControl改变其外观.   主题 iOS版 Android版 光(默认适用于iOS) 黑暗(默认为Android) 应用预定义的主题 ...

  4. 什么时候使用NO_UNNEST

    select * from test a where object_id in (select department_id from hr.dept_1 dept where department_i ...

  5. [转载]memcached stats 命令

    STAT pid 1552 STAT uptime 3792 STAT time 1262517674 STAT version 1.2.6 STAT pointer_size 32 STAT cur ...

  6. 【转】opencv检测运动物体的基础_特征提取

    特征提取是计算机视觉和图像处理中的一个概念.它指的是使用计算机提取图像信息,决定每个图像的点是否属于一个图像特征.特征提取的结果是把图像上的点分为不同的子集,这些子集往往属于孤立的点.连续的曲线或者连 ...

  7. (转)keytools命令

    结合网络资源,对keytool使用总结,以备后用: Keytool是一个Java数据证书的管理工具 ,Keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件 ...

  8. 如何避免被C++默认拷贝构造函数忽悠?

    一.背景介绍           因为工作关系,需要用到C++编程.对于我来说,虽然一直从事的是linux平台下的嵌入式软件开发,但深入用到C++的特性的地方并不多.对于C++,用得最多的无非是指针. ...

  9. 【Python爬虫基础】抓取知乎页面所有图片

    抓取地址所有图片 #! /usr/bin/env python from urlparse import urlsplit from os.path import basename import ur ...

  10. C++中数组初始化

    #include<iostream>using std::cout;using std::endl;int arr1[5];int arr2[5] = {1,3,5};int main() ...