Java并发编程读书笔记(一)
----------------------------------------------《Java并发编程实战》读书笔记------------------------------------------------------------------------------
第二章 线程安全性
java同步 1、sychronized
2、volatile类型
3、显示锁
4、原子变量
性能优化之原则:首先保证代码能正确运行,然后再提高代码速度。并且,只是当性能测试结果和应用需求需要提高性能、
并且测量结果表明该种优化在实际环境中确实能够带来性能提升时,才进行优化。
1、无状态对象一定是线程安全的,例如无状态servlet (大多数servlet都是无状态的)
2、原子性
比如 count++就不是原子性操作,它包括了 读取count —— count值+1 —— 新值放回count 三个操作
这样的非原子操作在多线程环境下就会出现线程安全性问题
并发编程中,由于多个线程交替执行不恰当的执行时序而出现不正确的结果,称为竞态条件。
最常见的一种静态条件: 先检查,后执行。 即通过一个可能已经是失效的监测结果来决定下一步的执行动作。
原子变量
多线程累加计数使用java.util.concurrent.atomic.AtomicLong类型代替long,其incrementAndGet()方法实现自增加1,这是线程安全的。
原子变量不能解决所有并发问题,只能对某个变量进行原子操作,如果是一段过程,则没法进行原子操作。多个变量进行依赖的情况也无能为力。
例子:(在一个servlet.service()方法里,建两个AtomicReference存一对值key-value,每次查询key命中就返回value,如果不命中就设置新的key-value)
3、 内置锁
即代码同步块synchronized ,是一种互斥机制,任何一个执行同步代码块的线程,都不可能看到其他线程在执行由同一个锁保护的同步代码块。
好比是一个每次只能出现一个人的房间,其他人要想进入这个房间,必须等里面的这个人出去,并且每次房间里最多只能有一个人。
e.g. 可以把上面的那个servlet的service()方法设置为public synchronized void service(),保证了线程安全性,但性能太低。
每次只有一个线程能访问service方法,而service又是servlet的主要方法,这相当于servlet变成单线程的了
4、 重入
指的是java内置锁的一种特性,线程在重复获取一个已经由它持有内置锁的时候,是可以成功的。
public class Widget{
public synchronized void doSomething(){}
}
public class LoginWidget extends Widget{
public synchronized void doSomething(){
...
super.doSomething();
}
}
子类调用自己的doSomething方法持有锁,然后在方法体内再调用父类的doSomething方法,请求的是同一个锁,
如果没有重入特性,那么此处将会发生死锁。
5、 同步的两个方面
1、线程安全性
2、内存可见性(memory visibility)
线程在使用一个资源的时候其他线程不可以修改这个资源;同时,当线程对一个资源的状态进行了修改之后,其他线程应该可以看得见这个变化。即为内存可见性。
Java并发编程读书笔记(一)的更多相关文章
- java并发编程读书笔记(1)-- 对象的共享
1. 一些原则 RIM(Remote Method Invocation):远程方法调用 Race Condition:竞态条件 Servlet要满足多个线程的调用,必须是线程安全的 远程对象,即通过 ...
- CSAPP 并发编程读书笔记
CSAPP 并发编程笔记 并发和并行 并发:Concurrency,只要时间上重叠就算并发,可以是单处理器交替处理 并行:Parallel,属于并发的一种特殊情况(真子集),多核/多 CPU 同时处理 ...
- Java并发编程学习笔记
Java编程思想,并发编程学习笔记. 一.基本的线程机制 1.定义任务:Runnable接口 线程可以驱动任务,因此需要一种描述任务的方式,这可以由Runnable接口来提供.要想定义任务,只需实现R ...
- Java并发编程实战.笔记十一(非阻塞同步机制)
关于非阻塞算法CAS. 比较并交换CAS:CAS包含了3个操作数---需要读写的内存位置V,进行比较的值A和拟写入的新值B.当且仅当V的值等于A时,CAS才会通过原子的方式用新值B来更新V的值,否则不 ...
- java并发编程实践笔记
文章转自:http://kenwublog.com/java-concurrency-in-practise-note 1, 保证线程安全的三种方法 :a, 不要跨线程访问共享变量b, 使共享变量是 ...
- 多线程-java并发编程实战笔记
线程安全性 编写线程安全的代码实质上就是管理对状态的访问,而且通常都是共享的,可变的状态. 一个对象的状态就是他的数据,存储在状态变量中,比如实例域或静态域.所谓共享是指一个对象可以被多个线程访问:所 ...
- Java并发编程实战笔记—— 并发编程1
1.如何创建并运行java线程 创建一个线程可以继承java的Thread类,或者实现Runnabe接口. public class thread { static class MyThread1 e ...
- Java并发编程学习笔记 深入理解volatile关键字的作用
引言:以前只是看过介绍volatile的文章,对其的理解也只是停留在理论的层面上,由于最近在项目当中用到了关于并发方面的技术,所以下定决心深入研究一下java并发方面的知识.网上关于volatile的 ...
- Java 并发编程学习笔记 理解CLH队列锁算法
CLH算法实现 CLH队列中的结点QNode中含有一个locked字段,该字段若为true表示该线程需要获取锁,且不释放锁,为false表示线程释放了锁.结点之间是通过隐形的链表相连,之所以叫隐形的链 ...
随机推荐
- [leetcode]438. Find All Anagrams in a String找出所有变位词
Given a string s and a non-empty string p, find all the start indices of p's anagrams in s. Strings ...
- 6-Qt给父widget加上styleSheet(添加背景图)而不改变子widget的styleSheet的方法
Qt给父widget加上styleSheet(添加背景图)而不改变子widget的styleSheet的方法 比如用stylesheet给widget加背景图,可以用qt designer修改ui文件 ...
- shell中数组基础语法
数组的基本赋值 arr=(a b c) arr[index]=a 2.常用的两个方法 str=${arr[@]}(数组转化成字符串) len=${#arr[*]}(数组长度) 3.遍历数组的方法 #! ...
- 通过yiic来创建yii应用
一.通过yiic来创建yii应用 (*yiic命令在yii下载包的framework目录下) 1.把你自已的php环境添加到系统环境变量中. 2.在命令行下输入: yiic webapp 位置\名称 ...
- struts框架中OGNL表达式的使用之jsp页面获取action中的属性值
在jsp页面中获取action中的值: 1.写一个action类OgnlAction类: 需要注意的地方: 如果在aciton中直接使用ognl表达式,将值存储的值栈中,是不能通过跳转将值传到jsp页 ...
- Luogu 3960 [NOIP2017] 列队 - splay|线段树
题解 是我从来没有做过的裂点splay... 看的时候还是很懵逼的QAQ. 把最后一列的$n$个数放在一个平衡树中, 有 $n$ 个点 剩下的$n$行数, 每行都开一个平衡树,开始时每棵树中仅有$1$ ...
- linux永久关闭防火墙
- Debian use sudo
刚安装好的Debian默认还没有sudo功能.1.安装sudo# apt-get install sudo2.编辑 /etc/sudoers ,添加如下行# visudoroot ALL=(ALL:A ...
- Jmeter运行过程中如何让Fiddler同时可以抓获到服务器的应答报文
在默认情况下,Jmeter运行过程中,Fiddler是抓不到对应的应答报文的. 但是,在某些时候,我们希望分析Jmeter执行失败的原因,想了解Jmeter获取到的应答报文是否有问题,就需要同服务器返 ...
- R 语言安装问题集锦
R安装问题R CMD INSTALL -l /data1/jhh/envirment/R/R_lib /data1/jhh/software/qvalue_2.10.0.tar.gz 问题1 :con ...