juc读书笔记

Question

如何保证构造器线程安全

什么事java监视器模式

建议

多读多看多试,这本书不太好总结知识

第一章

操作系统为各个独立执行的进程分配各种资源,包括内存,文件句柄以及安全证书等。

每个线程都有自己的程序计数器,栈以及局部变量等。

操作系统提供了一些高效的方法来实现多路IO,列如Unix的select和poll系统调用,要调用这些方法,Java类库需要获取一组实现非阻塞IO的包,然而,在现代操作系统,线程数已获得极大得提升,这使得在某些平台上,及时有更多的客户端,为每个客户端分配一个线程也是可行得。

在多线程程序中,当线程调度器临时挂起活跃线程并转而运行另一个线程时们就会频繁出现上下文切换操作,这种操作将带来极大的开销;保存和恢复执行上下文,丢失局部性,并且CPU时间将更多得花在线程调度而不是线程运行上。当线程共享数据时,必须使用同步机制,而这些机制往往会一直某些编译器优化,时内存缓存区中的数据无效,以及增加共享内存总线的同步流量。

完毕

第二章

线程安全性

要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的(shared)和可变的(mutable)状态的访问。

AtomicReference 替代对象引用的线程安全类。

锁会导致活跃性问题和性能问题。

内置锁

同步代码块 synchronized

synchronized (lock){
    //由锁保护的共享状态
}
public synchronized void demo(){
    //由锁保护的共享状态
}

synchronized修饰的方法,锁是方法所在对象。如果是静态方法,所就是其Class对象

重入

自己已经获得的锁是可重入的

public synchronized void inner(){
    //由锁保护的共享状态
}
public synchronized void outter(){
    //由锁保护的共享状态
    this.inner();
}

第三章

名词解释

内存可见性

当一个线程修改了对象状态后,其他线程能够看到发生得状态变化。

栈封闭

栈封闭是线程封闭的一种特例。不会逸出的局部变量。

Final域

final能确保初始化过程的安全性,从而可以不受限制的访问不可变对象,并在共享这些对象时无需同步

描述语句

java内存模型要求,变量的读取操作和写入操作都必须是原子操作,但对非volatile类型得long和double类型,JVM允许将64位得读或写操作分解为两个32位操作。可以用锁或者volatile声明来保护。

当把变量声明位volatile类型后,编译器与运行时都会注意到这个变量是共享得,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者大于其他处理器不可见的地方,因此在读取volatile类型的变量是总会但会最新写入的值。是一种轻量级的同步机制,不会阻塞线程。

volatile变脸通常是做某个操作完成·、发送终端或者状态的的标志。

p42再看

第四章

CopyOnWriteArrayList

查看源码可知,当写时会复制一个新的list,修改这个新的list,旧的list可以正常使用,当新的list写值完成时,内置的list变为新的,所以新旧不冲突不会有线程安全的问题(必须迭代器遍历)

要确保类的线程安全性,就需要确保他的不变性条件不会在并发访问的情况下被破坏。

多使用final类型的域

使用客户端加锁操作时要分析与原加锁代码是否使用同一个锁

完结

第五章

哪些容器支持客户端加锁?

为什么vector支持客户端加锁

concurrentHashMap使用分段锁(后续11章),无法使用客户端加锁

闭锁

CountDownLatch

FutueTask

信号量

基本完成

Last updated