随笔分类 -  【Java多线程 -- 高级进阶】

摘要:乐观锁和悲观锁 Synchronized属于 悲观锁 ,悲观地认为程序中的并发情况严重,所以严防死守。CAS属于 乐观锁 ,乐观地认为程序中的并发情况不那么严重,所以让线程不断去尝试更新。 性能对比: Synchronized关键字会让没有得到锁资源的线程进入blocked状态,而后在争夺到锁资源后 阅读全文
posted @ 2018-07-01 00:44 西北野狼 编辑
摘要:深入学习semaphore 控制同时访问资源线程数 访问特定资源前,先使用acquire(1)获得许可,如果许可数量为0,该线程则一直阻塞,直到有可用许可。 访问资源后,使用release()释放许可。 demo: 非公平策略 acquire实现,核心代码如下: java final int non 阅读全文
posted @ 2018-05-24 10:10 西北野狼 编辑
摘要:Hashmap在并发环境下,可能出现的问题: 1、多线程put时可能会导致get无限循环,具体表现为CPU使用率100%; 原因:在向HashMap put元素时,会检查HashMap的容量是否足够,如果不足,则会新建一个比原来容量大两倍的Hash表,然后把数组从老的Hash表中迁移到新的Hash表 阅读全文
posted @ 2018-05-08 14:57 西北野狼 编辑
摘要:Fork/Join 框架:就是在必要的情况下,将一个大任务,进行拆分(fork)成若干个小任务(拆到不可再拆时),再将一个个的小任务运算的结果进行 join 汇总。 Fork/Join 框架与线程池的区别 ForkJoinPool封装类: 使用forkJoinPool Demo: 结果: 阅读全文
posted @ 2017-04-03 17:15 西北野狼 编辑
摘要:第四种获取线程的方法:线程池,一个 ExecutorService,它使用可能的几个池线程之一执行每个提交的任务,通常使用 Executors 工厂方法配置。 线程池可以解决两个不同问题:由于减少了每个任务调用的开销,它们通常可以在执行大量异步任务时提供增强的性能,并且还可以提供绑定和管理资源(包括 阅读全文
posted @ 2017-04-02 23:23 西北野狼 编辑
摘要:写一条线程,读多条线程能够提升效率。 写写/读写 需要“互斥”;读读 不需要互斥. api相关方法: demo: 结果: 阅读全文
posted @ 2017-04-02 16:26 西北野狼 编辑
摘要:编写一个程序,开启 3 个线程,这三个线程的 ID 分别为A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。如:ABCABCABC…… 依次递归? 上面有一部分使用java1.8新特性写的,看下结果: 阅读全文
posted @ 2017-04-02 12:26 西北野狼 编辑
摘要:为了解决多线程安全问题在 Java 5.0 之前,协调共享对象的访问时可以使用的机制只有 synchronized 和 volatile 。Java 5.0 后增加了一些新的机制,但并不是一种替代内置锁的方法,而是当内置锁不适用时,作为一种可选择的高级功能。 隐式锁 synchronized 显示锁 阅读全文
posted @ 2017-03-30 23:54 西北野狼 编辑
摘要:Java 5.0 在 java.util.concurrent 提供了一个新的创建执行线程的方式:Callable 接口Callable 接口类似于 Runnable,两者都是为那些其实例可能被另一个线程执行的类设计的。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。Callabl 阅读全文
posted @ 2017-03-30 22:35 西北野狼 编辑
摘要:CountDownLatch 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,aw 阅读全文
posted @ 2017-03-29 23:26 西北野狼 编辑
摘要:hashtable效率低ConcurrentHashMap 线程安全,效率高 Java 5.0 在 java.util.concurrent 包中提供了多种并发容器类来改进同步容器 的性能。 关于锁分段机制: HashTable容器在竞争激烈的并发环境下表现出效率低下的原因是所有访问HashTabl 阅读全文
posted @ 2017-03-28 21:54 西北野狼 编辑
摘要:多线程原子性问题的产生和解决 原子变量:在 java.util.concurrent.atomic 包下提供了一些原子变量。 1. volatile 保证内存可见性,可以查看atomic中变量是使用volatile来进行修饰的: 2. CAS(Compare-And-Swap)比较并交换,算法保证数 阅读全文
posted @ 2017-03-19 17:48 西北野狼 编辑
摘要:内存可见性(Memory Visibility) 1 内存可见性(Memory Visibility)是指当某个线程正在使用对象状态而另一个线程在同时修改该状态,需要确保当一个线程修改了对象状态后,其他线程能够看到发生的状态变化。 2 可见性错误是指当读操作与写操作在不同的线程中执行时,我们无法确保 阅读全文
posted @ 2017-03-19 15:51 西北野狼 编辑