java并发编程11-JUC
JUC
AQS
   AbstractQueuedSynchronizer 是阻塞式的锁和相关的同步器工具的框架
ReentrantLock
如何重入
   用一个变量记录重入了多少次
NonfairSync
lock
   cas ,成功就吧ouner改为自己,否则acquire,把自己放进链表中
acquire
   tryacquire,成功就结束,失败的话还会尝试几次,然后才park,并为前驱标记,让前驱记得唤醒自己,如果曾经被打断的话,会被忽略,再次进入aqs队列,得到锁以后会打断自己来再次重新打断
java并发编程9-JDK线程池
JDK的线程池
线程池状态,RUNNING,SHUTDOWN(不会再接受新任务了),STOP(立刻停止),TIDYING(任务执行完毕,即将TERMINATED),TERMINATED
构造函数
1 | public ThreadPollExecutor(int corePoolsize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) |
- 核心线程数量
- 最大线程数量
- 就急线程生存时间
- 时间单位
- 阻塞队列
- 线程工厂: 给线程起个名字
- 拒绝策略
java并发编程7-不可变设计
不可变就是线程安全
如String
拷贝构造函数
之间赋值
char[]构造
拷贝一份(保护性拷贝)
子串
如果下标起点和母串起点相同,则之间引用过去,否则保护性拷贝(不明白为啥不共用)
享元模式
最小化内存的使用,共用内存
包装类
valueOf, 比如Long如果在-128到127之间,就使用一个cache数组,又如String串池,BigDecimal和BigInteger的某些数组
保护
千万要注意这些类的函数组合起来操作就不一定安全了,需要用原子引用类来保护
java并发编程4-同步与互斥
synchronized
锁住对象,放在静态方法前为锁类,放在普通方法前为锁类的对像。使用管程实现
线程安全类
String, Integer, StringBuffer,Random,Vector,Hashtable,juc;
加锁
把对象头的hash、Age和对象的指针放进自己的栈中,让对象头的hash、Age,位置指向自己的栈,
这时候来了另一个线程也想拿到锁,但是他肯定会失败,失败以后他就申请重量级锁,让对象头再次改变为指向管程,
当原来当线程想要释放锁的时候,依然使用cas,但是肯定失败,他发现现在的锁已经变成了重量级锁了。