JAVA
qq_34182649
这个作者很懒,什么都没留下…
展开
-
JAVA 多线程学习之LongAdder和AtomicLong
AtomicLong : CAS+自旋操作更新AtomicLong中的value值,进而保证value值的原子性更新。 public final long getAndUpdate(LongUnaryOperator updateFunction) { long prev, next; do { prev = get(); next = updateFunction.applyAsLong(prev);原创 2020-08-27 16:59:18 · 207 阅读 · 0 评论 -
JAVA多线程学习笔记 死锁问题
哲学家就餐问题很容易造成死锁避免死锁的方式既然可能产生死锁,那么接下来,讲一下如何避免死锁。1、让程序每次至多只能获得一个锁。当然,在多线程环境下,这种情况通常并不现实2、设计时考虑清楚锁的顺序,尽量减少嵌在的加锁交互数量3、既然死锁的产生是两个线程无限等待对方持有的锁,那么只要等待时间有个上限不就好了。当然synchronized不具备这个功能,但是我们可以使用Lock类中的tryLock方法去尝试获取锁,这个方法可以指定一个超时时限,在等待超过该时限之后变回返回一个失败信息...原创 2020-08-27 10:49:22 · 134 阅读 · 0 评论 -
JAVA 多线程学习笔记 线程的状态转换
情况 1 NEW --> RUNNABLE当调用 t.start() 方法时,由 NEW --> RUNNABLE情况 2 RUNNABLE <–> WAITINGt 线程用 synchronized(obj) 获取了对象锁后调用 obj.wait() 方法时,t 线程从 RUNNABLE --> WAITING调用 obj.notify() ,obj.notifyAll() , t.interrupt() 时竞争锁成功,t 线程从 WAITING -->.原创 2020-08-26 14:29:36 · 133 阅读 · 0 评论 -
JAVA 多线程学习笔记 设计模式之生产者/消费者模式
与前面的保护性暂停中的GuardObject不同,不需要产生结果和消费结果的线程—一对应 消费队列可以用来平衡生产和消费的线程资源生产者仅负责产生结果数据,不关心数据该如何处理,而消费者专心处理结果数据 消息队列是有容量限制的,满时不会再加入数据,空时不会再消耗数据JDK中各种阻塞队列,采用的就是这种模式...原创 2020-08-26 14:05:42 · 105 阅读 · 0 评论 -
JAVA 多线程学习笔记 设计模式之保护性暂停
即Guarded Suspension,用在一个线程等待另一个线程的执行结果、要点有一个结果需要从一个线程传递到另一个线程,让他们关联同一个GuardedObject、如果有结果不断从一个线程到另一个线程那么可以使用消息队列(见生产者/消费者)JDK中,join的实现、Future的实现,采用的就是此模式因为要等待另一方的结果,因此归类到同步模式...原创 2020-08-26 14:01:59 · 166 阅读 · 0 评论 -
JAVA 多线程学习笔记之wait/notify
wait/notify当Owner调用wait方法,就会进入WaitSet变为WAITING状态BLOCKED和WAITING的线程都处于阻塞状态,不占用CPU时间片BLOCKED线程会在Owner线程释放时唤醒WAITING线程会在Owner线程调用notify或notify时唤醒但唤醒后不会立即获得锁,仍要进入EntryList重新竞争...原创 2020-08-24 16:47:55 · 106 阅读 · 0 评论 -
JAVA 多线程学习笔记之第四章内容part3 synchronized优化原理
轻量级锁Object的markword会与 线程栈里面的Lock Record 交换交换前交换后MarkWord情况锁重入同一线程进入同一轻量级锁 会在线程栈中加一条lock record并且头为null锁膨胀(轻量级锁->重量级锁)这时候Thread-1加轻量级锁失败 会膨胀成重量级锁注意Object的markword变成了Monitor地址自旋优化偏向锁MarkWord情况ps:调用hashcode会禁用这个对象的偏向锁解释:偏向锁需要2的格式原创 2020-08-24 16:38:16 · 108 阅读 · 0 评论 -
JAVA 多线程学习笔记之第四章内容part2
参考资料https://www.cnblogs.com/haitaofeiyang/p/8385165.htmlhttps://blog.csdn.net/TenaciousD/article/details/95447078https://www.jianshu.com/p/73b9a8466b9c下图是对象头运行时的变化状态:锁标志位 和 是否偏向锁 确定唯一的锁状态其中 轻量锁 和 偏向锁 是JDK1.6之后新加的,用于对synchronized优化MonitorMonitor是原创 2020-08-22 17:13:24 · 214 阅读 · 0 评论 -
JAVA 多线程学习笔记之第四章内容part1
4.2 synchronizedsynchronized 实际是用对象锁保证了临界区内代码的原子性,临界区内的代码对外是不可分割的,不会被线程切换所打断。4.4 变量的线程安全分析成员变量和静态变量是否线程安全?如果它们没有共享,则线程安全 如果它们被共享了,根据它们的状态是否能够改变,又分两种情况如果只有读操作,则线程安全如果有读写操作,则这段代码是临界区,需要考虑线程安全局部变量是否线程安全?局部变量是线程安全的但局部变量引用的对象则未必如果该对象没有逃离方法的作用访问,它是线程原创 2020-08-22 16:58:27 · 158 阅读 · 0 评论 -
JAVA 多线程学习笔记之第三章内容
3.1创建与运行线程JAVA 创建线程的三种方法1.直接使用 Thread// 创建线程对象Thread t = new Thread() { public void run() { // 要执行的任务 }};// 启动线程t.start();2.使用 Runnable 配合 ThreadRunnable runnable = new Runnable() { public void run(){ // 要执行的任务 }};// 创建线程对象Thread t = new原创 2020-08-21 16:24:13 · 103 阅读 · 0 评论 -
JAVA 多线程学习笔记之第二章内容
2.2并行与并发单核 cpu 下,线程实际还是 串行执行 的。操作系统中有一个组件叫做任务调度器,将 cpu 的时间片(windows下时间片最小约为 15 毫秒)分给不同的程序使用,只是由于 cpu 在线程间(时间片很短)的切换非常快,人类感觉是 同时运行的 。总结为一句话就是: 微观串行,宏观并行 ,并发图解并行图解结论单核 cpu 下,多线程不能实际提高程序运行效率,只是为了能够在不同的任务之间切换,不同线程轮流使用cpu ,不至于一个线程总占用 cpu,别的线程没法干活多核原创 2020-08-21 16:07:29 · 102 阅读 · 0 评论 -
JVM 学习入门 JVM探究「狂神说」
面试常见:●请你谈谈你对JVM的理解? java8虚拟机和之前的变化更新?●什么是OOM,什么是栈溢出StackOverFlowError? 怎么分析?●JVM的常用调优参数有哪些?●内存快照如何抓取,怎么分析Dump文件?●谈谈JVM中,类加载器你的认识学习目录:1.JVM在系统中的位置2.JVM的体系结构...原创 2020-08-19 16:57:36 · 967 阅读 · 0 评论 -
JAVA 容器学习之HashSet
HashSet是采用哈希算法实现,底层实际是用HashMap实现的(HashSet本质就是一个简化版的HashMap),因此,查询效率和增删效率都比较高。代码: HashMap map; private static final Object PRESENT = new Object(); public TestHashSet(){ map = new HashMap(); } public int size(){ retu原创 2020-08-18 21:49:15 · 82 阅读 · 0 评论 -
JAVA 容器学习之HashMap
HashMap采用哈希算法实现,是Map接口最常用的实现类。 由于底层采用了哈希表存储数据,我们要求键不能重复,如果发生重复,新的键值对会替换旧的键值对。 HashMap在查找、删除、修改方面都有非常高的效率。PS:HashTable类和HashMap用法几乎一样,底层实现几乎一样,只不过HashTable的方法添加了synchronized关键字确保线程同步检查,效率较低。HashMap与HashTable的区别 1. HashMap: 线程不安全,效率高。允许key或value为null。原创 2020-08-18 21:43:10 · 97 阅读 · 0 评论 -
JAVA 容器学习之LinkedList
LinkedList底层用双向链表实现的存储。特点:查询效率低,增删效率高,线程不安全。双向链表也叫双链表,是链表的一种,它的每个数据节点中都有两个指针,分别指向前一个节点和后一个节点。 所以,从双向链表中的任意一个节点开始,都可以很方便地找到所有节点。LinkedList的存储结构图删除节点图解(蓝色是新链接) public void remove(int index){ Node temp = header; for(int i=0;i<index原创 2020-08-18 21:17:19 · 92 阅读 · 0 评论 -
JAVA 容器学习之ArrayList
ArrayList底层是用数组实现的存储。 特点:查询效率高,增删效率低,线程不安全。我们一般使用它ArrayList的扩容本质上是新建新的大数组,将久数组拷贝过去remove, add操作也是差不多的原理 public void remove(int index){ checkRange(index); int moveNum = elementData.length - index - 1; if(moveNum != 0){原创 2020-08-18 20:24:23 · 81 阅读 · 0 评论 -
JAVA设计模式之六大原则
参考资料:https://www.cnblogs.com/pony1223/p/7594803.html主要是对上面参考资料的总结和整理1.单一职责:一个类只负责一项职责。class Terrestrial{ public void breathe(String animal){ System.out.println(animal+"呼吸空气"); }}class Aquatic{ public void breathe(String animal){原创 2020-08-08 16:43:59 · 229 阅读 · 0 评论