Java并发编程13-并发总结

    阅读全文
fightinggg's avatar
fightinggg 4月 13, 2020

java并发编程12-集合的线程安全类

nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial 集合的线程安全类遗留的线程安全类 Hashtable,Vector直接把同步加到方法上 修饰的安全集合 装饰器模式,Syncronize* JUC安全集合Blocking型 大部分实现基于锁并提供阻塞的方法     阅读全文
fightinggg's avatar
fightinggg 4月 12, 2020

java并发编程11-JUC

nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial JUCAQS   AbstractQueuedSynchronizer 是阻塞式的锁和相关的同步器工具的框架 ReentrantLock如何重入   用一个变量记录重入了多少次 NonfairSynclock   cas ,成功就吧ouner改为自己,否则acquire,把自己放进链表中 acquire   tryacquire,成功就结束,失败的话还会尝试几次,然后才park,并为前驱标记,让前驱记得唤醒自己,如果曾经被打断的话,会被忽略,再次进入aqs队列,得到锁以后会打断自己来再次重新打断     阅读全文
fightinggg's avatar
fightinggg 4月 12, 2020

java并发编程10-异步模式

nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial 异步模式-工作线程线程不足导致饥饿 有两个线程A,B,任务有两种,上菜和做菜,显然上菜要等待做菜,如果AB都在执行上菜,就没有更多的线程做菜了,这就导致了AB在死等,注意这不是死锁, 所以不同的任务类型应该用不同的线程池     阅读全文
fightinggg's avatar
fightinggg 4月 12, 2020

java并发编程9-JDK线程池

nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial JDK的线程池 线程池状态,RUNNING,SHUTDOWN(不会再接受新任务了),STOP(立刻停止),TIDYING(任务执行完毕,即将TERMINATED),TERMINATED 构造函数1public ThreadPollExecutor(int corePoolsize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) 核心线程数量 最大线程数量 就急线程生存时间 时间单位 阻塞队列 线程工厂: 给线程起个名字 拒绝策略     阅读全文
fightinggg's avatar
fightinggg 4月 12, 2020

java并发编程8-自定义线程池

nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial 自定义线程池 把main看作任务的生产者,把线程看作任务的消费者,这时候模型就建立出来了 于是我们需要一个缓冲区,采取消费正生产者模式,然后让消费者不断消费,并在适当的时候创建新的消费者,如果所有任务都做完了,就取消消费者     阅读全文
fightinggg's avatar
fightinggg 4月 12, 2020

java并发编程7-不可变设计

nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial 不可变就是线程安全 如String 拷贝构造函数 之间赋值 char[]构造 拷贝一份(保护性拷贝) 子串 如果下标起点和母串起点相同,则之间引用过去,否则保护性拷贝(不明白为啥不共用) 享元模式 最小化内存的使用,共用内存 包装类 valueOf, 比如Long如果在-128到127之间,就使用一个cache数组,又如String串池,BigDecimal和BigInteger的某些数组 保护 千万要注意这些类的函数组合起来操作就不一定安全了,需要用原子引用类来保护     阅读全文
fightinggg's avatar
fightinggg 4月 11, 2020

java并发编程6-无锁并发

nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial CAS compareAndSet(prev,next);无锁,无阻塞 为什么效率高 失败的话会重新尝试,但是锁会进行上下文切换,代价大 原子整形AtomicInteger123incrementAndGet();getAndAdd(5);updateAndGet(value -> value*10);     阅读全文
fightinggg's avatar
fightinggg 4月 11, 2020

java并发编程5-Java内存

nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial JMM Java Memory Model 原子性: 保证指令不会收到线程上下文切换的影响 可见性: 保证指令不会受到cpu缓存的影响 有序性: 保证指令不会受到cpu指令并行优化的影响     阅读全文
fightinggg's avatar
fightinggg 4月 11, 2020

java并发编程4-同步与互斥

nexthexonextbutterflyvolantisyearnyiliashokaindigoapollolandscapecactusmateryicarusfluidmaterial synchronized 锁住对象,放在静态方法前为锁类,放在普通方法前为锁类的对像。使用管程实现 线程安全类 String, Integer, StringBuffer,Random,Vector,Hashtable,juc; 加锁 把对象头的hash、Age和对象的指针放进自己的栈中,让对象头的hash、Age,位置指向自己的栈, 这时候来了另一个线程也想拿到锁,但是他肯定会失败,失败以后他就申请重量级锁,让对象头再次改变为指向管程, 当原来当线程想要释放锁的时候,依然使用cas,但是肯定失败,他发现现在的锁已经变成了重量级锁了。     阅读全文
fightinggg's avatar
fightinggg 4月 10, 2020