第四章
豆瓣评分7.9还是不错的,并且目录上看也适合自己。个人技术栈比较杂,各方面都会一点,里面涉及的大多数技术或软件工具也都用过(redis,mongo,消息队列等),所以阅读起来还是比较轻松的。
读大学时读书也爱记笔记(主要出于方便复习的角度),现在纸质笔记携带不便,用电子笔记更合适些。
JUC 中的同步器三个主要的成员:CountDownLatch、CyclicBarrier 和Semaphore。这三个是 JUC 中较为常用的同步器,通过它们可以方便地实现很多线程之间协作的功能。
synchronized是用于修饰用的加锁关键词,synchronized属于隐式锁,即锁的持有与释放都是隐式的,我们无需干预。可以用于方法和代码块中,可以简单理解为锁住对象对应的指针地址,只要区分好指针对象是否同一个地址,就可以判断两个线程的锁是否互斥。
synchronized是可重入的,意思就是当前线程获得锁之后,其他线程就无法获得锁进入,但是当前线程自己还可以再次获得锁多次进入。
Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作,其中包括:AtomicBoolean、AtomicInteger、AtomicLong、AtomicReference。其底层就是volatile和CAS 共同作用的结果:
volatile 保证了内存可见性。
CAS(compare-and-swap)算法保证了原子性。 其中CAS算法的原理就是里面包含三个值:内存值A 预估值V 更新值 B 当且仅当 V == A 时,V = B; 否则,不会执行任何操作。
Java内存模型(Java Memory Model,JMM)JMM主要是为了规定了线程和内存之间的一些关系。
根据JMM的设计,系统存在一个主内存(Main Memory),Java中所有变量都储存在主存中,对于所有线程都是共享的。
每条线程都有自己的工作内存(Working Memory),工作内存中保存的是主存中某些变量的拷贝,线程对所有变量的操作都是在工作内存中进行,线程之间无法相互直接访问,变量传递均需要通过主存完成。
双亲委派(可以理解为父类委派,parents翻译问题,理解起来有些费解):当某个类加载器需要加载某个.class文件时,它首先把这个任务委托给他的上级类加载器,递归这个操作,如果上级的类加载器没有加载,自己才会去加载这个类。
Update your browser to view this website correctly. Update my browser now