教程:Java多线程编程实战指南
卍,第11章:
11.1
※,Linux内核工具perf可以查看程序运行过程中的缓存未命中情况。·sudo perf stat -e cache-references,cache-misses java -jar test.jar·
※,·lscpu`查看处理器的高速缓存层次。
11.2
11.3
卍,第1章:
1.7. 线程的监视
卍,第二章
※,共享变量的含义:共享变量一定是多个线程都会访问到的变量。例如:多个线程运行一个类的同一个实例时,这个实例的属性就是共享变量。多个线程运行同一个类的不同实例时,这个类的属性不是共享变量。
※,原子性保证 要么执行完毕,要么未执行。可见性保证可以获取执行完毕的值而不是未执行的值。
※,
卍,第三章
※,线程安全问题从根源上讲是硬件(如写缓冲器)和软件(编译器)问题。但是从应用程序的角度来看,线程安全问题的产生是由于多线程应用程序缺乏某种东西:线程同步机制。线程同步机制是一套用于协调线程间的数据访问(Data access)及活动(Activity)的机制,该机制用于保障线程安全以及实现这些线程的共同目标。第三章讲解协调线程间共享数据访问的相关关键字和api,第五章讲解协调线程间活动的相关api。从广义上讲,Java平台提供的线程同步机制包括:
- 锁
- volatile关键字
- final关键字
- static关键字
- 一些相关的api,如Object.wait(),Object.notify()等。
※,读锁和写锁
- 任何线程读取变量的时候,其他线程都无法更新这些变量。一个线程更新共享变量的时候,其他任何线程都无法访问该变量。
获得条件 | 排他性 | 作用 | |
读锁 | 相应的写锁未被任何线程持有 |
对读线程是共享的, 对写线程是排他的 |
允许多个多线程可以同时读取共享变量, 并保障读线程读取共享变量期间没有其他任何线程能够更新这些共享变量 |
写锁 |
该写锁未被其他任何线程持有, 并且相应的读锁未被任何线程持有 |
对读线程和写线程都是排他的 | 使得写线程能够以独占的方式访问共享变量。 |
- 读写锁内部实现比内部锁和其他显示锁要复杂的多,因此读写锁只有在以下两个条件同时满足时才适用,否则使用读写锁会得不偿失(开销)。
- 1. 只读操作比写(更新)操作要频繁的多。
- 2. 读线程持有锁的时间比较长。
※,
※,
※,
※,
※,
※,
※,
※,