第1章 java多线程技能
页码12: synchronized 可以在任意对象及方法上加锁,而加锁的这段代码称为“互斥区”或“临界区”;
页码19:线程处于正在运行或准备开始运行的状态,就认为线程是“存活”的;
页码20:方法sleep()的作用是在指定的毫秒数内让当前“正在执行的线程”休眠(暂停执行)。这个“正在执行的线程”是指this.currentThread()返回的线程。
页码38:suspend与resume方法的缺点----独占和不同步;
页码43:在java中,线程的优先级具有继承性,比如A线程启动B线程,则B线程的优先级与A一样。
第2章 对象及变量的并发访问
页码54:方法中的变量不存在非线程安全问题,永远都是线程安全的。这是方法内部的变量私有的特性造成的;
页码57:在两个线程访问同一个对象中的同步方法时,一定是线程安全的;
页码59:关键字synchronized取得的锁都是对象锁;
页码61:只有共享资源的读写访问才需要同步化,如果不是共享资源,那么根本没有同步的必要(个人觉得这也是synchronized同步代码块存在的必要性);
页码67:当存在父子类继承关系时,子类是完全可以通过“可重入锁”调用父类的同步方法的;
页码69:同步不具有继承性;
页码71:synchronized方法是对当前对象进行加锁,而synchronized代码块是对某一个对象进行加锁;
页码97:synchronized关键字加到static静态方法上是给Class类上锁,而synchronized加到非静态方法上是给对象上锁;
页码99:异步的原因是持有不同的锁,一个是对象锁,另外一个是Class锁;
页码102:在JVM中具有String常量池缓存的功能;
页码104:同步synchronized代码块都不使用String作为锁对象;
页码109:只要互相等待对方释放锁就有可能出现死锁;
页码117:只要对象不变,即使对象的属性被改变,运行的结果还是同步的;’
页码120:关键字Volatile的作用是强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值;
页码123:关键字volatile解决的是变量在多个线程之间的可见性;而synchronized关键字解决的是多个线程之间访问资源的同步性;
页码123:线程安全包含原子性和可见性两个方面,java的同步机制都是围绕这两个方面来确保线程安全的;
页码124:volatile本身并不处理数据的原子性,而是强制对数据的读写及时影响到主内存;
页码127:原子类也并不完全安全;
页码128:出现这样的情况是因为addAndGet()方法是原子的,但方法和方法之间的调用却不是原子的,解决这样的问题必须要用同步;
页码131:得到这个结果是各线程间的数据没有可视性造成的,而关键字synchronized可以具有可视性。
页码132:synchronized可以保证进入同步方法或者同步代码块的每个线程,都看到由同一个锁保护之前所有的修改效果。
页码132:学习多线程并发,要着重“外练互斥,内修可见”,这是掌握多线程,学习多线程并发的重要技术点。(与页码123的理念是相通的)