随笔分类 -  Java多线程

摘要:在看AQS内部的时候发现很多使用java.util.concurrent.locks.LockSupport类的东西。 比如CountDownLatch.await 阻塞的时候以及使用阻塞队列进行take、take 方法在线程阻塞的时候也是使用的该类。下面研究其主要的使用方法。 1. 线程状态简单理 阅读全文
posted @ 2021-11-20 22:59 QiaoZhi 阅读(1471) 评论(0) 推荐(0) 编辑
摘要:简单研究下线程池的执行原理。以及execute 和 submit 方法的区别。 1. execute 方法接收的是一个Runnable 参数,返回值是void 类型,也就是不接收结果, 方法签名如下: java.util.concurrent.Executor#execute void execut 阅读全文
posted @ 2021-08-09 21:18 QiaoZhi 阅读(262) 评论(0) 推荐(0) 编辑
摘要:之前学习了ThreadPoolExecutor线程池的用法,现在学习下Forkjoin线程池的用法。主要也就是ForkJoinPool,该类和ThreadPoolExecutor是兄弟类,都继承自AbstractExecutorService。 1.简介 1.什么是Forkjoin以及适用场景 虽然 阅读全文
posted @ 2021-01-07 23:21 QiaoZhi 阅读(4675) 评论(0) 推荐(1) 编辑
摘要:AbstractQueuedSynchronizer简称为AQS。大多数开发者不会直接使用AQS,标准同步器类的集合能够满足绝大多数情况的需求。 1.AbstractQueuedSynchronizer简介 在基于AQS构建的同步容器类中,最基本的操作包括各种形式的获取和释放操作。获取操作是一种依赖 阅读全文
posted @ 2019-01-11 18:20 QiaoZhi 阅读(700) 评论(0) 推荐(0) 编辑
摘要:同步工具类可以是任何一个对象。阻塞队列可以作为同步工具类,其他类型的同步工具类还包括信号量(Semaphore)、栅栏(Barrier)、以及闭锁(Latch)。 所有的同步工具类都包含一些特定的结构化属性:它们封装了一些状态,这些状态将决定执行同步工具类的线程是继续执行还是等待,此外还提供了一些方 阅读全文
posted @ 2019-01-10 22:07 QiaoZhi 阅读(1114) 评论(0) 推荐(0) 编辑
摘要:多线程的实现方式有实现Runnable接口和继承Thread类(实际上Thread类也实现了Runnable接口),但是Runnable接口的方式有两个弊端,第一个是不能获取返回结果,第二个是不能抛出exception。但是Callable接口很好的解决了上面的问题。下面介绍Callable接口的使 阅读全文
posted @ 2019-01-10 11:05 QiaoZhi 阅读(3222) 评论(0) 推荐(0) 编辑
摘要:在项目中也经常可以见到原子类型(AtomicXXX)的使用,而且AtomicXXX常用来代替基本类型或者基本类型的包装类型,因为其可以在不加同步锁的情况下保证线程安全(只对于原子操作)。 下面以AtomicInteger为例子研究原子类型的线程安全性。 0. AtomicInteger 原子类型的基 阅读全文
posted @ 2019-01-07 19:18 QiaoZhi 阅读(890) 评论(0) 推荐(0) 编辑
摘要:1.同步容器类 同步容器类包括Vector和HashTable,这两个都是JDK早期的容器。后来在JDK1.2也引入一个功能与之类似的类,这些同步的封装容器类是由Collections.synchronizedXXX等工厂方法创建的。这些类实现线程安全的方式是:将他们的状态封装起来,并对每个公有方法 阅读全文
posted @ 2019-01-03 19:24 QiaoZhi 阅读(670) 评论(0) 推荐(0) 编辑
摘要:1.SimpleDateFormat非线程安全的问题 类SimpleDateFormat主要负责日期的转换与格式化,但在多线程环境中,使用此类容易造成数据转换及处理的不正确,因为SimpleDateFormat类并不是线程安全的。 1.多线程中存在的问题: 结果: 10:07:27 [cn.qlq. 阅读全文
posted @ 2019-01-03 10:39 QiaoZhi 阅读(537) 评论(0) 推荐(0) 编辑
摘要:1.线程组的概念 可以把线程归属到某一个线程组中,线程组中可以有线程对象,也可以有线程组,组中还可以用线程。这样的组织结构有点类似于树的形式。 线程组的作用是,可以批量的管理线程或者线程组对象,有效地对线程或线程组对象进行组织。 2.线程对象关联线程组:1级关联 1级关联就是父对象中有子对象,但并不 阅读全文
posted @ 2019-01-02 22:30 QiaoZhi 阅读(1522) 评论(0) 推荐(0) 编辑
该文被密码保护。
posted @ 2019-01-02 13:49 QiaoZhi 阅读(1357) 评论(0) 推荐(0) 编辑
摘要:在JDK类库中Timer类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务。此类也常用来做一下周期性同步工作,代替它的有quartz、SpringTask。Timer类的主要作用是设置计划任务,但封装任务的类是TimerTask类(实际该类是一个抽象类,执行任务的代码要放在该类的子类中) 阅读全文
posted @ 2018-12-27 11:41 QiaoZhi 阅读(17853) 评论(0) 推荐(1) 编辑
摘要:Java提供了两种新的容器类型:Queue和BlockingQueue。 Queue用于保存一组等待处理的元素。它提供了几种实现,包括:ConcurrentLinkedQueue,这是一个先进先出的并发对列,以及PriorityQueue,这是一个非并发的优先队列。Queue上的操作不会阻塞,如果队 阅读全文
posted @ 2018-12-26 13:54 QiaoZhi 阅读(2649) 评论(0) 推荐(1) 编辑
摘要:类ReentrantLock具有完全互斥排他的效果,即同一时间只有一个线程在执行ReentrantLock.lock()后面的代码。这样虽然保证了线程的安全性,但是效率低下。JDK提供了ReentrantReadWriteLock读写锁,使用它可以加快效率,在某些不需要操作实例变量的方法中,完全可以 阅读全文
posted @ 2018-12-21 18:40 QiaoZhi 阅读(1991) 评论(0) 推荐(3) 编辑
摘要:在Java多线程中可以使用synchronized隐式锁实现线程之间同步互斥,Java5中提供了Lock类(显示锁)也可以实现线程间的同步,而且在使用上更加方便。本文主要研究 ReentrantLock的使用。 公平锁与非公平锁:公平锁表示线程获取锁的顺序是按照线程加锁的顺序来分配的,即先来先得的F 阅读全文
posted @ 2018-12-17 11:24 QiaoZhi 阅读(4049) 评论(0) 推荐(0) 编辑
摘要:变量值的共享可以使用public static的形式,所有的线程都使用同一个变量。如果每个线程都有自己的共享变量,就可以使用ThreadLocal。比如Hibernat的session问题就是存在ThreadLoca中。 类ThreadLocal主要解决的就是每个线程绑定自己的值,可以将Thread 阅读全文
posted @ 2018-12-15 23:11 QiaoZhi 阅读(335) 评论(0) 推荐(0) 编辑
摘要:在线程的常见方法一节中,已经接触过join()方法的使用。 在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程将早于子线程结束。这时,如果主线程想等子线程执行完成才结束,比如子线程处理一个数据,主线程想要获得这个数据中的值,就要用到join()方法了。方法join()的作 阅读全文
posted @ 2018-12-14 18:17 QiaoZhi 阅读(16837) 评论(1) 推荐(8) 编辑
摘要:在Java语言中提供了各种各样的输入/输出流Stream,使我们能够方便地对数据进行操作,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据。一个发送数据到输出管道,另一个线程从输入管道中读数据。通过使用管道,实现不同线程间的通信,而无需借助于临时文件之类的动西。 在Ja 阅读全文
posted @ 2018-12-14 12:17 QiaoZhi 阅读(1903) 评论(0) 推荐(0) 编辑
摘要:wait/notify最经典的案例就是"生产者/消费者"模式。但是此模式有一些需要注意的地方。 生产者-消费者也有多种实现方式。 (1)常见的就是synchronized结合wait+notify实现 (2)用Lock类实现 (3)使用BlockingQueue阻塞队列实现 一、 synchroni 阅读全文
posted @ 2018-12-13 18:56 QiaoZhi 阅读(2704) 评论(0) 推荐(0) 编辑
摘要:使线程之间进行通信之后,系统间的交互性更加强大,在大大提高CPU利用率的同时还会使程序对各线程任务在处理的过程中进行有效的把控与监督。 1.不使用wait/notify实现线程间通信 使用sleep()+while(true)也可以实现线程间通信。 例如:两个线程,一个线程向集合中添加元素,当集合中 阅读全文
posted @ 2018-12-12 23:01 QiaoZhi 阅读(657) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示