juc
Java 程序源
微信公众号: Java 程序源,敬请关注!
展开
-
01. java 多线程
预留一篇做总结原创 2019-09-01 18:48:49 · 153 阅读 · 0 评论 -
13. 线程安全类型-集合
Java 中常见的集合类型都是不安全的, 比如说ArrayList, LinkedList, HashSet, TreeSet, HashMap, TreeMap 等, 这些都是线程不安全的. 也就是说当多线程访问这些数据时, 便可能会产生结果紊乱.Java5 之后, 在java.util.concurrent 包下新增了大量的支持高并发的集合接口和实现类, 同时Collections 工具类中...原创 2019-09-01 18:50:08 · 1782 阅读 · 0 评论 -
14. 线程安全类型-ThreadLocal
在多线程开发中, 我们有时需要用到一些和线程状态相关的变量, 每个线程所拥有的变量不一致. java 提供了ThreadLocal 变量来实现.1. ThreadLocalThreadLocal 为每一个使用该变量的线程创建了一个副本, 使得每一个线程都可以独立地变更自己的副本, 与其它线程的副本隔离, 以实现线程对象的私有变量.1.1 ThreadLocal API方法签名方法...原创 2019-09-01 18:49:48 · 1160 阅读 · 0 评论 -
15. 线程同步-sychronized与Lock
1. 线程安全问题在多线程环境下, 如果使用线程不安全的类型, 可能会产生并发问题. 解决线程安全问题, 笔者总结有以下三种情况:使用线程安全的变量: Automicxxx 等使用隐形锁, 借助synchronized 关键字使用显示锁, java5 新增的Lock 接口1.1 模拟多线程并发问题public class Product { private Integer...原创 2019-09-01 18:49:42 · 239 阅读 · 0 评论 -
16. 线程通信-传统方式
1. 线程通信的传统方式传统的线程通信方式指的是借助于, Object 基类中的wait(), notify(), notifyAll()方法. 这三个方法必须由同步监视器对象进行调用, 影响的也只是同一同步监视器的相关线程.1.1 同步监视器同步监视器, 也就是指监视的资源. 对于synchronized 同步方式, 有两种情况:synchronized 修饰的同步方法, 同步监视器...原创 2019-09-01 18:49:27 · 1115 阅读 · 0 评论 -
17. 线程通信-Condition
1. 线程通信-Condition当使用synchronized 进行线程同步时, 可以使用Object的wait(), notify(), notifyAll() 方法进行线程通信.但是当使用Lock 对象保证线程同步时, 便不能使用Object 的方法来进行线程通信了, 而是通过Condition 对象进行线程通信1.1 Condition APICondition 提供了和Obj...原创 2019-09-01 18:49:20 · 1147 阅读 · 0 评论 -
18. 线程通信-阻塞队列
1. 线程通信-阻塞队列1.1 阻塞APIBlockingQueue 接口提供了两个阻塞方法:void put(E e) throws InterruptedException: 像队列中添加元素, 如果队列已满, 则阻塞该线程.E take() throws InterruptedException: 从队列中取出元素, 如果队列为空, 则阻塞该线程.1.2 常见的阻塞队列Blo...原创 2019-09-01 18:49:14 · 1122 阅读 · 0 评论 -
19. 线程通信-监听异步线程结束
在企业开发中, 采用异步线程可以提升系统性能. 但是在异步线程开发中, 有时主线程需要监听异步线程何时执行结束, 然后再做一些其它操作. java 中有两种方式监听异步线程的结束: CountDownLatch 和 join.1. CountDownLatch 方式1.1 自定义线程类自定义线程类需要添加一个CountDownLatch 计数器, 建议在构造方法赋值务必保证CountD...原创 2019-09-01 18:49:08 · 2588 阅读 · 0 评论 -
20. 线程通信-虚假唤醒
1. 线程通信的虚假唤醒线程虚假唤醒指的是, 本以为满足了唤醒条件, 然后将阻塞的线程唤醒, 但是在开始执行逻辑时, 却不满足唤醒条件.1.1 Product 类新建两个方法sale()和 purchase(), 需要使用synchronized 关键字修饰使用this.wait()方法阻塞线程, 当使用if包裹wait()方法时, 容易产生虚假唤醒调用notifyAll()通知所有等...原创 2019-09-01 18:49:03 · 1154 阅读 · 0 评论 -
12. 线程安全类型-原子类型
1. 原子类型从java5 之后, java.util.concurrent.atomic 包下, 新增了一组原子类, 是基本类型对应的线程安全的类型. 命名为AtomicXXX1.1 常用原子类java.util.concurrent.atomicAtomicInteger: 原子整型AtomicLong: 原子Long 型AtomicBoolean: 原子布尔型AtomicIn...原创 2019-09-01 18:50:15 · 1493 阅读 · 0 评论 -
11. java线程池-ForkJoinPool
1. ForkJoinPooljava7 提供了ForkJoinPool 来支持将一个任务采用递归方式分成多个小任务计算, 然后再把小任务的计算结果合并为总的结果.1.1 ForkJoinPool 的创建方式java7 提供了两个构造器:ForkJoinPool(int paralleism): 创建时指定并行线程数ForkJoinPool(): 以当前机器的cpu个数(Runtim...原创 2019-09-01 18:50:22 · 1206 阅读 · 0 评论 -
10. 线程池-Executors 常见用法示例
1. 创建异步任务为了测试方法, 笔者创建一个有返回值的Callable类, 创建一个无返回值的Runnable 类.1.1 自定义Callablepublic class MyCallable implements Callable<String> { @Override public String call() throws Exception { ...原创 2019-09-01 18:50:30 · 1537 阅读 · 0 评论 -
02. 线程的五种状态
1. 线程的状态java 中, 线程有五种状态: 新建(New), 就绪(Ready), 运行(Running), 阻塞(Blocked), 死亡(Dead). 线程启动后, 不可能一直霸占着CPU 独自运行, CPU 需要在多个线程之间切换, 因此线程状态也就会在运行, 就绪之间来回切换.1.1 线程的五种状态之间的转换新建状态: 通过new 创建线程后, 线程便进入了新建状态新建 -...原创 2019-09-01 18:52:47 · 7202 阅读 · 0 评论 -
03. 异步线程创建-Thread 方式
1. 核心内容直接继承Thread类是创建异步线程最简单的方式, 但并不常用. 匿名内部类的方式可以考虑.1.1 继承Thread 方式特点开发简单, 可直接通过this.获取线程的相关信息违背了面向接口编程原则, 需直接继承Thread类, 不利于扩展. 不推荐使用主线程不能监控子线程何时结束, 也不能获取子线程返回结果切记启动异步线程的方式是调用star()方法, 而非调用run...原创 2019-09-01 18:52:36 · 2043 阅读 · 0 评论 -
04. 异步线程创建-Runnable 方式
1. 核心内容直接继承Thread类是创建异步线程最简单的方式, 但并不常用. 匿名内部类的方式可以考虑.1.1 继承Thread 方式特点开发简单, 可直接通过this.获取线程的相关信息违背了面向接口编程原则, 需直接继承Thread类, 不利于扩展. 不推荐使用主线程不能监控子线程何时结束, 也不能获取子线程返回结果切记启动异步线程的方式是调用star()方法, 而非调用run...原创 2019-09-01 18:52:16 · 4789 阅读 · 0 评论 -
05. 异步线程创建-Callable 方式
1. Callable 方式Callable 方式最主要的特点就是可以阻塞式获取子线程执行结果, 也就是说对于长耗时的任务,可以放到子线程中执行, 而主线程去执行其它任务. 当主线程执行完其它任务之后, 需要获取子线程任务返回结果时, 如果子线程没有执行完, 主线程会阻塞, 等子线程执行完之后, 再继续执行.1.1 Callable 特点面向接口编程, 松耦合设计在多线程模式下,可实现对...原创 2019-09-01 18:51:09 · 1575 阅读 · 0 评论 -
06. 守护线程
前言:1. 守护线程java 语言中有两种类型的线程, 用户线程和守护线程.1.1 守护线程与用户线程区别守护线程和用户线程唯一的区别就是:当jvm中只剩下守护线程时,jvm便会终止程序,所有守护线程立即结束。当jvm中还存在至少一个用户进程时, jvm 也不会终止程序。1.2 守护线程注意事项守护线程会随时终止守护线程创建的子线程也是守护线程, 纵使子线程设置为非...原创 2019-09-01 18:51:01 · 1086 阅读 · 0 评论 -
07. 线程组
1. 线程优先级每个线程执行时都具有一定的优先级, 优先级较高的线程将获得更多的执行机会.每个线程默认的优先级都和它的父线程的优先级相同默认情况下, main 程序具有普通优先级, 也就是51.1 优先级取值范围优先级的范围为1~10之间的整数, Thread 也提供了三个常用的优先级常量:Thread.MIN_PRIORITY: 值为1, 最低优先级Thread.NORM_P...原创 2019-09-01 18:50:52 · 1050 阅读 · 0 评论 -
08. 线程异常捕获
1. 线程的异常捕获1.1 线程异常的捕获从java5 开始, Java 加强了对线程异常的处理. 如果线程执行过程中抛出了一个未处理的异常, JVM在结束该线程之前, 会自动查找该线程是否拥有对应的线程异常处理器对象, 若找到之后, 则调用异常处理器的方法处理异常.java5 之前通常都会使用try-catch, 包裹run()/callable()方法, 这样代码会有些臃肿1.2 ...原创 2019-09-01 18:50:44 · 1097 阅读 · 0 评论 -
09. 线程池-Executors 相关API
系统创建和销毁一个线程的成本是比较高的, 因为它涉及到与操作系统的交互. 因此, 使用线程池可以很好地提高性能, 尤其是在系统需要频繁创建大量且生命周期很短暂的线程时. 线程池和数据库连接池异曲同工.1. 线程池创建工具类-Executors在java5之前, 我们需要自己动手创建线程池, 设置初始化数量, 阻塞队列等. 从java5 之后, java 新增了Executors 工厂类来创建...原创 2019-09-01 18:50:36 · 1356 阅读 · 0 评论 -
21. java9 的发布订阅
1. java9 的发布订阅java9 新增了一个发布-订阅框架, 该框架是基于异步响应流的. 之前开发发布订阅通常都会借助于中间件, 如mq, redis 等, java9之后, 对于简单的发布订阅系统, jdk便直接可以满足.1.1 相关APIFlow.Pulisher: 消息的生产者, 发布者Flow.Subscriber: 数据的订消费者, 订阅者Flow.Subscripti...原创 2019-09-01 18:48:56 · 1689 阅读 · 1 评论