
Java线程
文章平均质量分 63
汪小哥
有多少时光可以挥洒~人生短短几十年~
展开
-
一个入门级的利用线程池查询优化
1.背景一个简单的查询服务的优化,“并行”和“串行”,将一批查询到的任务进行for each的组装,组装数据会调用各种各样的服务(dubbo、redis、mysql)等等,这种情况下随意业务任务的增多、整体查询服务的时间线性增加,因此想着法子将“串行”的服务变为并行的,全部处理完成后将结果返回即可。任务信息 /** * 任务信息 */ @Data public static class TaskInfo { private Integer原创 2021-07-06 20:33:12 · 766 阅读 · 2 评论 -
DelayQueue 队列
DelayQueue—-一种有序队列,特点就是只有在队列中的元素到期后才能取出。1.内存中哪些对象到了超时时间,需要从内存中清除出去。 2.服务器连接中有哪些连接很长时间未操作,需要关闭这些连接 3.任务中有哪些到了执行时间,该进行调度了。public class DelayQueue<E extends Delayed> extends AbstractQueue<E> implem原创 2016-05-24 16:18:26 · 594 阅读 · 0 评论 -
java 中 阻塞队列 非阻塞队列 和普通队列的区别是什么?
阻塞队列与普通队列的区别在于,当队列是空的时,从队列中获取元素的操作将会被阻塞,或者当队列是满时,往队列里添加元素的操作会被阻塞。试图从空的阻塞队列中获取元素的线程将会被阻塞,直到其他的线程往空的队列插入新的元素。同样,试图往已满的阻塞队列中添加新元素的线程同样也会被阻塞,直到其他的线程使队列重新变得空闲起来,如从队列中移除一个或者多个元素,或者完全清空队列.1.ArrayDeque, (数组双端队原创 2016-05-24 16:58:39 · 23265 阅读 · 3 评论 -
Java中Collections
Collection是集合类的一个顶级接口,其直接继承接口有List与Set而Collections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。此类不能实例化。Collections中有一些工具函数,比如说sort、reverse、fill等等。看到了之后比较的好奇呗,在hashtable的时候进行同步,为了防止引用返回后别修改,原创 2016-08-09 10:24:21 · 2322 阅读 · 0 评论 -
CountDownLath
作为同步工具的一种,有点类似于一道门似得,必须要所有的人都到齐了,才可以让大家都走。类似计数器的一种同步工具。 2.我们看看他的类图 3.其实这里面,如果简单的掌握使用就是非常的简单,await()。这个方法就是等待计数器变为零的时候,才允许放走所有的人。刚刚开始实例化这个同步工具的时候可以初始化这个值,每次到了一个人,调用countDown(). 计数器就会减少1.4.这个例子呢,在源码原创 2016-08-11 20:24:38 · 567 阅读 · 0 评论 -
Semaphore
这个也是一个同步的线程工具类 看到出来,这里有实现公平锁和非公平锁内部使用的队列,这个抽象的队列使用的很广泛啊! 2. 我看看我这个书上说的东西 这里和释放锁和得到锁关系很密切啊。 public void release() { sync.releaseShared(1); }public void acquire() throws InterruptedEx原创 2016-08-11 20:45:45 · 435 阅读 · 0 评论 -
CyclicBarrier
CyclicBarrier 也是一个同步的工具,和CountDownLath非常的类似。 个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。在涉及一组固定大小的线程的程序中,这些线程必须不时地互相等待,此时 CyclicBarrier 很有用。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。场景原创 2016-08-11 21:00:57 · 386 阅读 · 0 评论 -
Excutor
.Excutor 这个只是一个简单的接口 执行程序的意思public interface Executor { /** * Executes the given command at some time in the future. The command * may execute in a new thread, in a pooled thread, or in原创 2016-08-14 20:57:34 · 1241 阅读 · 0 评论 -
DelayQueue
DelayQueue = BlockingQueue + PriorityQueue + Delayed 是一个无界的BlockingQueue,用于放置实现了Delayed接口的对象,其中的对象只能在其到期时才能从队列中取走。这种队列是有序的,即队头对象的延迟到期时间最长。注意:不能将null元素放置到这种队列中。 Delayed,一种混合风格的接口,用来标记那些应该在给定延迟时间之后执行的对原创 2016-08-14 21:33:08 · 570 阅读 · 0 评论 -
Callable、Future接口实现原理,FutureTask 原理解析,获取线程的返回值
callable callbale只是一个接口,用来处理执行一个线程后可以获取到线程的返回值,这个是主要的用途public interface Callable<V> { V call() throws Exception;}从上面看这个接口非常的简单,仅仅是执行一个返回,然后有个返回值,这个在线程中的实现原理是什么样的?返回值是怎么处理的? 其实就是让某个线程中有个callabl原创 2017-09-01 17:06:06 · 1974 阅读 · 0 评论 -
SimpleAsyncTaskExecutor(源码)简单的异步任务支持限流,ListenableFutureTask支持注册事件->FutureTask的继承
SimpleAsyncTaskExecutor 异步执行用户任务的SimpleAsyncTaskExecutor。每次执行客户提交给它的任务时,它会启动新的线程,并允许开发者控制并发线程的上限(concurrencyLimit),从而起到一定的资源节流作用。默认时,concurrencyLimit取值为-1,即不启用资源节流。<bean id="simpleAsyncTaskExecutor"原创 2017-09-30 15:15:17 · 15163 阅读 · 1 评论 -
并发容器CopyOnWriteArrayList
Copy-On-Write简称COW,是一种用于程序设计中的优化策略。其基本思路是,从一开始大家都在共享同一个内容,当某个人想要修改这个内容的时候,才会真正把内容Copy出去形成一个新的内容然后再改,这是一种延时懒惰策略。从JDK1.5开始Java并发包里提供了两个使用CopyOnWrite机制实现的并发容器,它们是CopyOnWriteArrayList和CopyOnWriteArraySet。C原创 2016-05-24 09:50:28 · 852 阅读 · 0 评论 -
码农小汪-缓存的原理 读写锁的实现缓存
在java中经常用到缓存,在SSh框架中也会用到一级缓存和二级缓存,到底缓存是怎么实现的呢?简单讲就是,如果某些资源或者数据会被频繁的使用,而这些资源或数据存储在系统外部,比如数据库、硬盘文件等,那么每次操作这些数据的时候都从数据库或者硬盘上去获取,速度会很慢,会造成性能问题。 一个简单的解决方法就是:把这些数据缓存到内存里面,每次操作的时候,先到内存里面找,看有没有这些数据,如果有,那么就直接使原创 2016-04-06 00:03:33 · 1424 阅读 · 0 评论 -
码农小汪-JVM的重排序
之前看过JVM本书,好多东西都还没有理解透,今天发现了重排序,有必要去网上找点资料来说说,放在自己的博客中,好观看。自己也加深印象。虽然不经常使用。但是概念还是必须要有的涩。 我自己记得,就是按照顺序的执行动作,最近忙起来,没有复习这个东西啦,要学习的东西还有很多啦。重排序通常是编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段。重排序分为两类:编译期重排序和运行期重排序,原创 2016-04-02 11:07:03 · 546 阅读 · 0 评论 -
码农小汪-synchronized
synchronized英 [’sɪŋkrənaɪzd] 美 [’sɪŋkrənaɪzd] 同步的 网络 同步; 关键字; 同步锁同步的原理monitor 监测仪; 显示屏,屏幕; JVM规范规定JVM基于进入和退出Monitor对象来实现方法同步和代码块同步,但两者的实现细节不一样。代码块同步是使用monitorenter和monitorexit指令实现,而方法同步是使用另外一原创 2016-04-02 13:48:13 · 1263 阅读 · 0 评论 -
码农小汪-锁 LOCK
在java中有两种方法实现锁机制,一种是线程同步机制:synchronized,而另一种是比synchronized更加强大和领过的Lock。Lock确保当一个线程位于代码的临界区时,另一个线程不进入临界区,相对于synchronized,Lock接口及其实现类提供了更加强大、灵活的锁机制。自Java 5开始,java.util.concurrent.locks包中包含了一些锁的实现,因此你不用去实原创 2016-04-02 15:26:12 · 743 阅读 · 0 评论 -
码农小汪-ReentrantLock 可重入锁
ReentrantLock,可重入的互斥锁,是一种递归无阻塞的同步机制。它可以等同于synchronized的使用,但是ReentrantLock提供了比synchronized更强大、灵活的锁机制,可以减少死锁发生的概率。对于ReentrantLock,官方有详细的说明:一个可重入的互斥锁定 Lock,它具有与使用 synchronized 方法和语句所访问的隐式监视器锁定相同的一些基本行为和语义原创 2016-04-02 15:55:57 · 811 阅读 · 0 评论 -
码农小汪-线程通信
线程通信的目标是使线程间能够互相发送信号。另一方面,线程通信使线程能够等待其他线程的信号。例如,线程B可以等待线程A的一个信号,这个信号会通知线程B数据已经准备好了。这个就是一个同步的过程涩通过共享对象通信线程间发送信号的一个简单方式是在共享对象的变量里设置信号值。线程A在一个同步块里设置boolean型成员变量hasDataToProcess为true,线程B也在同步块里读取hasDataToPr原创 2016-04-02 23:06:39 · 579 阅读 · 0 评论 -
码农小汪-Java Condition
这个东西,到底是做什么用的呢?上过操作系统课程的童鞋们,一定听过的,生产者和消费者问题我首先不用这个玩意做一下,简单的生产消费。消费者,从工厂拿一个东西,出来。运行在线程中的。/** * * @author JetWang * */public class Customer { /** * 依赖工厂 */ public Factory facrory;原创 2016-04-03 14:15:00 · 764 阅读 · 0 评论 -
码农小汪-ReentrantLock-lock方法
我们知道,ReentrantLock有公平锁和不公平锁区分,我们首先来看一下,继承图简单了解哈。 public class ReentrantLock implements Lock, java.io.Serializable private final Sync sync; /** * Base of synchronization control for thi原创 2016-04-03 18:46:00 · 2486 阅读 · 2 评论 -
码农小汪-Volatile和Transient
Volatile: Volatile修饰的成员变量在每次被线程访问时,都强迫从主内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到主内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。 Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。 这样当多个原创 2016-04-03 19:03:51 · 865 阅读 · 0 评论 -
码农小汪-ReentrantLock-unlock
释放锁 unlock()public void unlock() { sync.release(1); }放掉一个锁和之前的acuqire一个样release public final boolean release(int arg) { if (tryRelease(arg)) { Node h = head;原创 2016-04-03 19:33:42 · 613 阅读 · 0 评论 -
码农小汪-信号量(Semaphore)
简介信号量Semaphore是一个控制访问多个共享资源的计数器,它本质上是一个“共享锁”。 Java并发提供了两种加锁模式:共享锁和独占锁。ReentrantLock就是独占锁。对于独占锁而言,它每次只能有一个线程持有,而共享锁则不同,它允许多个线程并行持有锁,并发访问共享资源。 独占锁它所采用的是一种悲观的加锁策略, 对于写而言为了避免冲突独占是必须的,但是对于读就没有必要了,因为它不会影原创 2016-04-03 20:39:13 · 607 阅读 · 0 评论 -
码农小汪之-线程的基本概念
学习操作系统的时候,我们就经常接触,线程,进程。不免的讨论消费者,生产者问题。引发的竞争和同步的问题。这个对于线程来说,必须的了解的。我们开发中,在并发编程,多线程的情况下,肯定会接触这些东西。所以,我也想学习哈哈。先理解一些基本的概念:共享、可变、线程安全性、线程同步、原子性、可见性、有序性。共享、可变要编写线程安全的代码,其核心在于对共享的和可变的状态进行访问。“共享”就意味着变量可以被多个线程原创 2016-04-02 10:50:59 · 476 阅读 · 0 评论