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对象)
- 补充: 对于静态方法,它们的内置锁为它们所在类的 class 对象
//同步块1
synchronized(lock){
your statement1
}
//同步块2
synchronized(lock){
your statement2
}
- 可见性:后一个线程拿到的值是前一个线程修改生效的值,这就称之为前一个线程对于共享变量的修改对于后一个线程来说是可见的。后一个线程看得到前一个线程做的修改
- 饥饿:即某一个线程永远得不到机会来执行同步块中的代码,分为以下几种情形:
- 多个线程都在执行了wait方法,都处于等待的状态,一旦别的线程执行notify操作,总有那么一个倒霉等待线程总是轮不到唤醒它,导致该线程处于饥饿状态
- 等待线程执行的优先级比较低
- …
java并发编程_建立概念的更多相关文章
- 1.1 Java并发编程的一些概念
并发编程的一些概念 同步和异步 同步: 同步方法必须等到方法调用返回后,才能继续后继的行为.也就是说,同步方法执行时,如果没有返回,则后面的方法是执行不到的.同步方法调用,调用过程中可能出现阻塞和等待 ...
- java并发编程_基本模块构建
读<java并发编程实战>第五章学习记录:该章节主要介绍一些并发编程中一些基本的构建模块.如并发容器和并发工具类(闭锁和栅栏)以及一些需要注意的情况 并发容器 1. ConcurrentH ...
- 【java并发编程实战】-----线程基本概念
学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的"系统",需要自己好好总结.整理才能征服它.希望同仁们一起来学习 ...
- java并发编程基础概念
本次内容主要讲进程和线程.CPU核心数和线程数.CPU时间片轮转机制.上下文切换,并行和并发的基本概念以及并发编程的好处和注意事项,为java并发编程打下扎实基础. 1.什么是进程和线程 1.1 进程 ...
- 原创】Java并发编程系列2:线程概念与基础操作
[原创]Java并发编程系列2:线程概念与基础操作 伟大的理想只有经过忘我的斗争和牺牲才能胜利实现. 本篇为[Dali王的技术博客]Java并发编程系列第二篇,讲讲有关线程的那些事儿.主要内容是如下这 ...
- NO.001- 简说 Java 并发编程史
这篇文章是Java并发编程思想系列的第一篇,主要从理解Java并发编程历史的原因和Java并发演进过程两部分,以极简地回溯并发编程的历史,帮助大家从历史这个角度去了解一门语言一个特性的演进.对历史理解 ...
- Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)
Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...
- 【转】关于Java并发编程的总结和思考
一.前言 就是想学习Java并发编程了,所以转载一下这篇认为还不错的博客~ 二.正文 编写优质的并发代码是一件难度极高的事情.Java语言从第一版本开始内置了对多线程的支持,这一点在当年是非常了不起的 ...
- 《Java并发编程的艺术》留给自己以后看的笔记
<Java并发编程的艺术>这本书特别好,和<深入了解JAVA虚拟机>有一拼,建议做java的都看看,下面全部都是复制书中的部分内容,主要目的是做个笔记,方便以后遇到问题能找到. ...
随机推荐
- IC 小常识
IC产品的命名规则: 大部分IC产品型号的开头字母,也就是通常所说的前缀都是为生产厂家的前两个或前三个字母,比如:MAXIM公司的以MAX为前缀,AD公司的以AD为前缀,ATMEL公司的以AT为前缀, ...
- 可以供MFC调用的,QT实现的DLL(使用qt-solutions的qtwinmigrate实现)
MFC和QT的消息循环机制不同,所以,要让QT写的DLL可以供MFC调用,要做一点特殊的处理 #include <qmfcapp.h> #include <qwinwidget.h& ...
- curl http认证
有些站点需要http认证.(apache认证:http://blog.csdn.net/zf213/article/details/4252592) 如果访问http://test:123789@xx ...
- MFC断点无效
方法1: 将出问题的CPP文件用系统记事本notepad打开,然后另存时选择unicode编码保存,覆盖掉原来的文件即可.一般这种方法一般会解决VS断点无法设定的80%问题.没有办法才请出第2种方法. ...
- 2015第28周六SVN和Git
svn作为一个优秀源码版本的管理工具,可以适合绝大多数项目.但是因为它的采用中心化管理,不可避免的存在本地代码的备份和版本管理问题.也就是说对于尚未或暂无法提交到Subversion服务器的本地代码来 ...
- class$1,class$2,class$innerclass中的$的含义
class文件名中的$的含义如下: $后面的类是$前面的类的内部类 内部类有以下两种情况: 1.普通的组合类形式,即在一个类内部定义一个普通的类 public class Outer { cla ...
- 求一个数组中第K小的数
面试南大夏令营的同学说被问到了这个问题,我的第一反应是建小顶堆,但是据他说用的是快排的方法说是O(n)的时间复杂度, 但是后来经过我的考证,这个算法在最坏的情况下是O(n^2)的,但是使用堆在一般情况 ...
- eclipse与myeclipse工程互转
eclipse转myeclipse: 在Myeclipse中新建web工程导入即可. myeclipse转eclipse: 在eclipse中新建web工程,把myeclipse项目中代码手动拷贝到 ...
- 翻译brent ozar的sqlserver dba训练课程——第一章:建立数据库服务器清单
在公司里,走进销售副总裁的办公室,询问他手下有多少销售人员.不,我的意思是你并不要那么做,他们会问你销售工具为什么那么慢. 其实我的意思是,如果你能走进他的办公室问他这个问题.我敢打赌,他会马上回答 ...
- 【转】在ASP.NET MVC中,使用Bundle来打包压缩js和css
在ASP.NET MVC4中(在WebForm中应该也有),有一个叫做Bundle的东西,它用来将js和css进行压缩(多个文件可以打包成一个文件),并且可以区分调试和非调试,在调试时不进行压缩,以原 ...