第一章
 
线程共享进程范围内的资源,但每个线程都有各自的程序计数器、栈以及局部变量等。
多个线程可以同时调度到多个CPU上运行。
 
线程的优势?
在服务应用程序中,可以提升资源利用率以及系统吞吐率,发挥多处理器的强大功能。
 
线程的优先级  执行时间  线程切换需要额外的开销
 
第二章
 
如果多个线程访问同一个可变的状态变量是没有使用合适的同步,那么程序就会出现错误,有以下三种方法修复这种问题。
1、不在线程之间共享该状态变量
2、将状态变量改为不可变的变量
3、在访问状态变量时使用同步
 
什么是线程安全?自己百度
 
无状态对象一定是线程安全的
 
注意count++这类操作的问题:不是原子的,实际上是三部操作 读取-修改-写入
 
什么是竞态条件?
在并发编程中,由于不恰当的执行时序从而使得结果变得不可靠。常见的竞态条件类型就是“先检查后执行” ,例如常见的对象懒加载
 
一个包:java.concurrent.atomic
 
 
内置锁:加锁机制,java中用于确保原子性的内置机制。同步代码块、同步方法
以synchronized来修饰的方法叫同步方法,该同步代码块的锁就是方法调用所在的对象,静态的 synchronized方法以Class对象作为锁
 
每个java对象都可以用作实现一个同步的锁,称为内置锁或监视器锁。
线程在进入同步代码块前会自动获得锁,并且在退出同步代码块时自动释放锁。
 
内置锁是可重入的。
 
理解一句话:状态变量是由这个锁保护的。
 
锁不要滥用,同步代码块太大会引起不良并发,大大拉低程序性能。当执行较长的计算或者可能无法快速完成的操作时(如网络I/O、控制台I/O),一定不要持有锁。
 
第三章
 
同步机制不只是为了实现原子性或者确定“临界区”,还确保了多个线程之间对内存操作的可见性。
加锁的含义不仅仅局限于互斥行为,还包含内存可见性。
 
注意重排序现象
 
最低安全性:当线程在没有进行同步的情况下读取变量时,可能会的到一个时效值,但至少这个值是由之前某个线程设置的,而不是一个随机值。
非volatile类型的64位数值变量(double和long)不适用于最低安全性,因为JVM允许将64位的读操作或写操作分解为两个32位的操作
 
一种稍弱的同步机制,即volatile变量。
加锁机制即可以确保可见性又可以确保原子性,而volatile变量只能确保可见性。(确保只有单个线程更新变量的值时可以用 volatile变量 )
 
发布一个对象
意思是指,是对象能够在当前作用域之外的代码中使用。
 
逸出
当某个不应该发布的对象被发布时,被称为逸出。
 
发布对象的方式:
发布对象最简单的方法是将对象的引用保存到一个公有的静态变量中。
从非私有的方法中返回一个对象的引用,如java web开发中常用的get set方法。
发布一个内部类的实例(内部类实例包含外部类实例的引用)
 
不要在构造过程中使用this引用逸出(只有在构造函数返回时,this引用才应该从线程中逸出)
 
线程封闭
如果在单线程内访问数据,就不需要同步。这种技术称为线程封闭。
 
实现线程封闭的方法:
Ad-hoc线程封闭(了解)
栈封闭(在方法内的局部变量访问对象,熟悉)
ThreadLocal类(常用)
 
ThreadLocal类
这个类能使线程中的某个值与保存值的对象关联起来。该类提供get与set等访问接口或方法,这些方法为每个使用该变量的线程都存有一份独立副本,因此get总是返回当前线程在调用set时设置的最新值。当线程终止后,这些值会作为垃圾回收。
 
不可变对象一定是线程安全的
 
满足以下条件时,对象才是不可变的:
对象创建以后其状态就不可以修改
对象的所有域都是final类型
对象是正确创建的(创建对象时,this引用没有逸出)

java并发编程实战(java concurrency in practice)的更多相关文章

  1. 【Java并发编程实战】----- AQS(四):CLH同步队列

    在[Java并发编程实战]-–"J.U.C":CLH队列锁提过,AQS里面的CLH队列是CLH同步锁的一种变形.其主要从两方面进行了改造:节点的结构与节点等待机制.在结构上引入了头 ...

  2. 【Java并发编程实战】----- AQS(三):阻塞、唤醒:LockSupport

    在上篇博客([Java并发编程实战]----- AQS(二):获取锁.释放锁)中提到,当一个线程加入到CLH队列中时,如果不是头节点是需要判断该节点是否需要挂起:在释放锁后,需要唤醒该线程的继任节点 ...

  3. 【Java并发编程实战】----- AQS(二):获取锁、释放锁

    上篇博客稍微介绍了一下AQS,下面我们来关注下AQS的所获取和锁释放. AQS锁获取 AQS包含如下几个方法: acquire(int arg):以独占模式获取对象,忽略中断. acquireInte ...

  4. 【Java并发编程实战】-----“J.U.C”:CountDownlatch

    上篇博文([Java并发编程实战]-----"J.U.C":CyclicBarrier)LZ介绍了CyclicBarrier.CyclicBarrier所描述的是"允许一 ...

  5. 【Java并发编程实战】-----“J.U.C”:CyclicBarrier

    在上篇博客([Java并发编程实战]-----"J.U.C":Semaphore)中,LZ介绍了Semaphore,下面LZ介绍CyclicBarrier.在JDK API中是这么 ...

  6. 【Java并发编程实战】-----“J.U.C”:ReentrantReadWriteLock

    ReentrantLock实现了标准的互斥操作,也就是说在某一时刻只有有一个线程持有锁.ReentrantLock采用这种独占的保守锁直接,在一定程度上减低了吞吐量.在这种情况下任何的"读/ ...

  7. 【Java并发编程实战】-----“J.U.C”:Semaphore

    信号量Semaphore是一个控制访问多个共享资源的计数器,它本质上是一个"共享锁". Java并发提供了两种加锁模式:共享锁和独占锁.前面LZ介绍的ReentrantLock就是 ...

  8. 【Java并发编程实战】-----“J.U.C”:ReentrantLock之三unlock方法分析

    前篇博客LZ已经分析了ReentrantLock的lock()实现过程,我们了解到lock实现机制有公平锁和非公平锁,两者的主要区别在于公平锁要按照CLH队列等待获取锁,而非公平锁无视CLH队列直接获 ...

  9. 【Java并发编程实战】-----“J.U.C”:ReentrantLock之一简介

    注:由于要介绍ReentrantLock的东西太多了,免得各位客官看累,所以分三篇博客来阐述.本篇博客介绍ReentrantLock基本内容,后两篇博客从源码级别分别阐述ReentrantLock的l ...

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

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

随机推荐

  1. GConf error:Failed to contact configuration server

    Linux系统运行一直正常,但是图形界面使用root账号登录时遇到下面错误,第一次遇到这么怪异的状况 具体错误信息如下所示: GConf error:Failed to contact configu ...

  2. 在虚拟机中安装红旗桌面7.0 Linux操作系统的详细图文教程

    本文作者:souvc 本文出处:http://www.cnblogs.com/liuhongfeng/p/5343087.html 以下是详细的内容: 一.安装虚拟机. 安装虚拟机可以参考:在Wind ...

  3. ubuntu16.04连接android手机蓝牙共享网络热点

    最近的想要用android手机蓝牙共享wifi网络给ubuntu16.04系统用,查了好多资料,发现网上很少有有用的.自己实践后分享如下. 第一步:手机与电脑配对:         该步骤比较简单,网 ...

  4. Linux svn的搭建与使用

    Linunx svn的搭建与使........纯手打的.. 一.安装前的准备 1.1 配置yum 库 1)加载光盘 2)进入/etc/yum.repo.d目录 3)复制"rhel-debug ...

  5. Linux FHS

    学习linux有必要了解FHS的知识,FHS英文全称是Filesystem Hierarchy Standard.中文翻译就是文件系统层次结构标准.关于这个详细的介绍参考官方的文档和鸟哥linux书. ...

  6. 解决webkit浏览器中js方法中使用window.event提示未定义的问题

    这实际上是一个浏览器兼容性问题,根源百度中一大堆,简要说就是ie中event对象是全局变量,所以哪里都能使用到,但是webkit内核的浏览器中却不存在这个全局变量event,而是以一个隐式的局部变量的 ...

  7. [译文]选择使用正确的 Markdown Parser

    以下客座文章由Ray Villalobos提供.在这篇文章中Ray将要去探索很多种不同的Markdown语法.所有的这些MarkDown变种均提供了不同的特性,都超越传统的Markdown语法,却又相 ...

  8. hdu 4704 Sum (整数和分解+快速幂+费马小定理降幂)

    题意: 给n(1<n<),求(s1+s2+s3+...+sn)mod(1e9+7).其中si表示n由i个数相加而成的种数,如n=4,则s1=1,s2=3.                  ...

  9. 利用QMP和QEMU虚拟机交互的几种方式

    QMP是一种基于JSON格式的传输协议,我们能利用它与一个QEMU虚拟机实例进行交互,例如查询,更改虚拟机的状态,获取设备信息等等.下面是几种创建QMP的方法以及对其它的一些基本命令的使用: 1.基于 ...

  10. 你不知道的Javascript(上卷)读书笔记之一 ---- 作用域

    你不知道的Javascript(上卷)这本书在我看来是一本还不错的书籍,这本书用比较简洁的语言来描述Js的那些"坑",在这里写一些博客记录一下笔记以便消化吸收. 1 编译原理 在此 ...