并发
文章平均质量分 72
shumeigang
这个作者很懒,什么都没留下…
展开
-
K8S集群
Kubernetes转载 2023-03-10 11:06:00 · 1146 阅读 · 0 评论 -
Exchanger
1、概念 Exchanger(交换者)是一个用于线程间协作的工具类。 Exchanger用于进行线程的数据交换。 Exchanger提供一个同步点,在这个同步点,两个线程可以交换彼此的数据...原创 2020-08-19 16:46:55 · 132 阅读 · 0 评论 -
Semaphore
概念 Semaphore是java并发包里面的一个工具类,我们限制可以访问某些资源的线程数目就可以使用Semaphore了 Semaphore:可理解为允许线程执行信号的池子,池子中放入多少个信号就允许多少线程同时执行。 Semaphore的作用:限制线程并发的数量注意:的是 Semaphore 只是对资源并发访问的线程数进行监控,并不会保证线程安全Semaphore使用方法Semaphore(int permits)创建具有给定的许可数和非公平的公平设置的 Semap...原创 2020-08-19 16:32:38 · 94 阅读 · 0 评论 -
CyclicBarrier
1、概念CyclicBarrier可循环使用的屏障,让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时屏障才会开门 ,所有被屏障拦截的线程才会继续运行。CyclicBarrier和CountDownLatch一样,都是关于线程的计数器。2.常用的方法:CyclicBarrier(int parties)创建一个新的 CyclicBarrier,它将在给定数量的参与者(线程)处于等待状态时启动,但它不会在启动 barrier 时执行预定义的操作。CyclicBarrie...原创 2020-08-19 14:33:35 · 109 阅读 · 0 评论 -
CountDownLatch
1、概念 CountDownLatch:具有计数器的功能,等待其他线程执行完毕,主线程在继续执行,用于监听某些初始化操作,并且线程进行阻塞,等初始化执行完毕后,通知主线程继续工作执行原创 2020-08-19 09:48:03 · 74 阅读 · 0 评论 -
java原子操作类
Java从JDK1.5开始提供了java.util.concurrent.atomic包,这个包中的原子操作类提供了一种用法简单,性能高效,线程安全地更新一个变量的方式。在Java并发比编程中,要想保证一些操作不被其他线程干扰,就需要保证原子性...原创 2020-08-18 10:59:49 · 158 阅读 · 0 评论 -
Fork/Join 框架
Fork/Join框架介绍 Fork/Join框架是Java 7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结 果后得到大任务结果的框架。Fork/Join框架要完成两件事情: 1.任务分割:首先Fork/Join框架需要把大的任务分割成足够小的子任务,如果子任务比较大的话还要对子任务进行继续分割 2.执行任务并合并结果:分割的子任务分别放到双端队列里,然后几个启动线程分别从双端队列里获取任务执行。子任务执行 ...原创 2020-08-17 14:47:43 · 87 阅读 · 0 评论 -
Java 中的阻塞队列
一.什么是阻塞队列?阻塞队列是一个在队列基础上又支持了两个附加操作的队列。这两个附加的操作支持阻塞和插入和移除方法。支持阻塞的插入方法:队列满时,队列会阻塞插入元素的线程,直到队列不满。 支持阻塞的移除方法:队列空时,获取元素的线程会等待队列变为非空。二.阻塞队列的应用场景阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。简而言之,阻塞队列是生产者用来存放元素、消费者获取元素的容器。...原创 2020-08-17 10:12:11 · 69 阅读 · 0 评论 -
ConcurrentHashMap的实现原理与使用
ConcurrentHashMap是线程安全且高效的HashMap。为什么要使用ConcurrentHashMap?1线程不安全的HashMap(在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%)2效率低下的HashTable(HashTable)...原创 2020-08-14 11:05:55 · 260 阅读 · 0 评论 -
Condition接口
Condition介绍Condition接口也提供了类似Object的监视器方法,与Lock配合可以实现等待/通知模式,但是这两者在使用方式以及功能特性上还是有差别的。Object上的监视器只有一个等待队列,但是Condition上可以有多个等待队列Condition是对象监视器的替代品,拓展了监视器的语义Condition类的方法方法 说明 public void await() 使当前线程等待,直到发出信号或中断信号。 public boolean await(.原创 2020-08-13 19:26:32 · 153 阅读 · 0 评论 -
LockSupport
LockSupport 当需要阻塞或唤醒一个线程的时候,都会使用LockSupport工具类来完成相应 工作。LockSupport定义了一组的公共静态方法,这些方法提供了最基本的线程阻塞和唤醒功 能,而LockSupport也成为构建同步组件的基础工具。LockSupport 是用来创建锁和其他同步类的基本线程阻塞原语LockSupport方法介绍 方法 说明 void park() 阻塞当前线程,如果调用unpark方法或者当前线程被中...原创 2020-08-13 18:12:39 · 77 阅读 · 0 评论 -
Lock接口
Lock接口Lock接口有6个方法:// 获取锁 void lock() 是平常使用得最多的一个方法,就是用来获取锁。如果锁已被其他线程获取,则进行等待。在前面已经讲到,如果采用Lock,必须主动去释放锁,并且在发生异常时,不会自动释放锁// 如果当前线程未被中断,则获取锁,可以响应中断 void lockInterruptibly() 方法比较特殊,当通过这个方法去获取锁时,如果线程正在等待获取锁,则这个线程能够响应中断,即中断线程的等待状态。例如,当...原创 2020-08-13 15:06:22 · 99 阅读 · 0 评论 -
ThreadLocal 的使用
ThreadLocal类允许我们创建只能被同一个线程读写的变量。因此,如果一段代码含有一个ThreadLocal变量的引用,即使两个线程同时执行这段代码,它们也无法访问到对方的ThreadLocal变量ThreadLocal提供了线程的局部变量,每个线程都可以通过set()和get()来对这个局部变量进行操作,但不会和其他线程的局部变量进行冲突,实现了线程的数据隔离~。ThreadLocal可以让我们拥有当前线程的变量ThreadLocal是什么呢?每一个ThreadLocal能够放一个线程级原创 2020-08-13 11:15:23 · 176 阅读 · 0 评论 -
Thread.join()
管道输入/输出流形式:PipedReader、PipedWriter、PipedInputStream、PipedOutputStream。 PipedOutputStream、PipedInputStream主要是面向字节流;PipedReader、PipedWriter主要是面向字节流;原创 2020-08-12 16:00:43 · 155 阅读 · 0 评论 -
等待/通知机制
场景:一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行响应的操作,整个过程开始于一个线程,而最终执行又是另一个线程。前者是生产者,后者是消费者,这种模式隔离了“做什么”和“怎么做”,在功能层面上实现了解耦,体系结构上具备了良好的伸缩性,但是在java语言中如何实现类似的功能呢?实现:简单的办法是让消费者不断地循环检查是否符合预期,如下代码:while(value!=desire){Thread.sleep(1000);}上面的伪代码在条件不满足的时候就睡眠一段时间,这样做的目的是原创 2020-08-12 10:41:59 · 307 阅读 · 0 评论 -
过期的suspend,resume 和stop
方法介绍suspend():暂停任务 resume():恢复任务 stop():停止任务stop()当调用stop()方法时会发生两件事: 即刻停止run()方法中剩余的全部工作,包括在catch或finally语句中,并抛出ThreadDeath异常(通常情况下此异常不需要显示的捕获),因此可能会导致一些清理性的工作的得不到完成,如文件,数据库等的关闭。 会立即释放该线程所持有的所有的锁,导致数据得不到同步的处理,出现数据不一致的问题。 suspend()和resu.原创 2020-08-11 19:26:42 · 306 阅读 · 0 评论 -
interrupt,interrupted,isInterrupted
interrupt()其作用是中断此线程(此线程不一定是当前线程,而是指调用该方法的Thread实例所代表的线程),但实际上只是给线程设置一个中断标志,线程仍会继续运行。interrupted()作用是测试当前线程是否被中断(检查中断标志),返回一个boolean并清除中断状态,第二次再调用时中断状态已经被清除,将返回一个false。isInterrupted ()作用是只测试此线程是否被中断 ,不清除中断状态。...原创 2020-08-11 17:35:27 · 212 阅读 · 0 评论 -
final 域的内存
final域的内存语义对于final域,编译器和处理器要遵守两个重要的重排序规则: 1:在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。 2:初次读一个包含final域的对象的引用,与随后初次都这个final域,这两个操作之间不能重排序。...原创 2020-08-06 10:19:36 · 92 阅读 · 0 评论 -
Java并发-线程和进程的区别
线程和进程的区别是什么?1.简而言之,一个程序至少有一个进程,一个进程至少有一个线程.2.线程的划分尺度小于进程,使得多线程程序的并发性高。3.另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。4.线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。5.从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时原创 2020-07-23 11:03:15 · 176 阅读 · 0 评论 -
synchronized
synchronized 的实现原理与应用synchronized 称为 重要级锁synchronized 保证每个时刻只有一个线程执行同步代码,相当于是让线程顺序执行同步代码。java 中的每一个对象都可以作为锁 表现以下3种形式1 对于普通同步方法,锁是当前实例对象2对于静太同步方法,锁是当前类的Class 对象。3对于同步方法块,锁是Synchonized 括号里配置的对象...原创 2020-08-04 10:04:41 · 81 阅读 · 0 评论 -
锁
锁1 公平锁/非公平锁公平锁:多个线程申请获取同一个锁,按照线程的申请顺序,排队获取锁。公平锁的好处是等待的线程不会被饿死,相应的缺陷 就是整体吞吐量很低、效率很低,使用new ReentrantLock(true)可以构造一个公平锁。非公平锁:多个线程申请获取同一个锁,获取锁的顺序不按照申请顺序,抢占式的获取。非公平锁的好处是整体效率很高,但是 可能会使有些线程一致在等待,造成饿死。使用Synchronized、new Reen...原创 2020-08-04 10:03:11 · 87 阅读 · 0 评论 -
sleep和wait的区别
sleep和wait的区别:1、sleep是Thread的静态方法,wait是Object的方法,任何对象实例都能调用。2、sleep不会释放锁,它也不需要占用锁。wait会释放锁,但调用它的前提是当前线程占有锁(即代码要在synchronized中)。3、它们都可以被interrupted方法中断。sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。sleep,wait调用后都会暂停当前线程并让出cpu的执行原创 2020-08-04 10:01:06 · 251 阅读 · 0 评论 -
Volatile
Volatile变量:一种同步的弱形式。它确保参一个变量的更新以可预见的方式告知其他的线程。1 Volatile 变量的操作不会加锁。也就不会引起执行线程的阻塞2 Volatile 变量地可见性的影响所产生的价值远远高于变量本身3 加锁可以保证可见性与原子性,volatile 变量只能可见性4volatile 关键字通过添加内存屏障(Memory Barriers)的方式来禁止特定类型的处理器重排序,即重排序时不能把后面的指令放到内存屏障之前满足下面所有的标准后,你才能使用Volatile...原创 2020-08-04 09:59:07 · 144 阅读 · 0 评论 -
Java并发 concurrent
concurrent包的实现阻塞队列 BlockingQueue :表示一个线程安放入和提取实例的队列用法:BlockingQueue 通常用于一个线程生产对象,而另外一个线程消费这些对象的场景一个线程往里边放,另外一个线程从里边取的一个 BlockingQueue方法:方法 抛异常 特定值 阻塞 超时 插入 add(o) offer(o) put(o) offer(o, timeout, timeunit) 移除 ..原创 2020-08-04 09:58:09 · 126 阅读 · 0 评论