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

参考与并发编程网 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. 可用版本的host

    http://blog.csdn.net/ljphhj/article/details/11939591 http://my.oschina.net/lvkun0223/blog/282356 两者的 ...

  2. Gridview中奇偶数行颜色设置

    在gridview中的RowDataBound事件里面写 switch (e.Row.RowType) {case DataControlRowType.Header: e.Row.BackColor ...

  3. TCP 协议

    == 已经了解了以太网和IP了,下面我们进入传输层,开始讲解TCP协议. == 仍然先把TCP报文段的格式放在这里,然后我们看图说话: TCP报文段也分为首部和数据两部分,首部默认情况下一般是20字节 ...

  4. 关于NAT穿透的一些理解

    前些天在知乎回答了一个智能家居远程控制方面的问题,感觉自己对无公网IP地址环境下的穿透问题有些了解.昨天同事拿来一个网络摄像头,安装在ADSL路由器上网的环境下,可以远程查看视频,效果还挺不错,问我厂 ...

  5. BZOJ3391: [Usaco2004 Dec]Tree Cutting网络破坏

    3391: [Usaco2004 Dec]Tree Cutting网络破坏 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 47  Solved: 37[ ...

  6. 【转】Thunderbird中配置签名

    原文网址:https://support.mozilla.org/zh-CN/kb/Thunderbird%E4%B8%AD%E9%85%8D%E7%BD%AE%E7%AD%BE%E5%90%8D “ ...

  7. Android 应用框架 —— 组件

    本文内容根据个人自学整理记录,理解不当之处,希望大家批评指正,大家相互学习,写学习归纳,写博客是个好习惯,希望能够坚持下去. 在前一篇文章当中介绍了Android 的系统框架,主要是为了让大家对And ...

  8. 面试问题:关于java并发方面的

    主要是回答一下面试中可能会碰到的问题.慢慢的积累一下.一个星期以后,补全.

  9. WEB/ WCF安全认证

  10. MySQL 分区表原理及使用详解

    今天统计数据的时候发现一张表使用了表分区,借此机会记录一下. 1. 什么是表分区? 表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分.从逻辑上看,只有一张表,但是底层却是由 ...