java并发
xiaoyao9571
这个作者很懒,什么都没留下…
展开
-
CyclicBarrier
前篇文章介绍的CountDownLatch可以用来倒计数,适用于一个线程等待多个线程的情况。如果要实现多个线程互相等待的效果,此时CyclicBarrier就比较合适了。 与CountDownLatch一样,CyclicBarrier也是JDK1.5位于java.util.concurrent包下的一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点(common bar...原创 2018-03-06 20:29:56 · 312 阅读 · 0 评论 -
Exchanger
java.util.concurrent包下Exchanger<T>类可以实现两个线程之间的数据交换,其中参数T是泛型,表示交换的对象类型。 Exchanger<T>只有一个无参构造器,Exchanger()。 有两个重载方法exchange(V x)和exchange(V x, long timeout, Timeunit, unit)。作用是等待...原创 2018-03-08 23:45:58 · 238 阅读 · 0 评论 -
同步之Semaphore信号量
基于Semaphore的特点,如果将信号量初始化为1,使得它在使用时最多只有一个可用的许可,从而可用作一个相互排斥的锁。 下面将使用Semaphore来实现买票的例子,可参考《同步之synchronized关键字》以了解该问题。package com.gk.thread.mutex.semaphore;import java.util.concurrent.Semaphore;...原创 2018-03-07 20:53:08 · 358 阅读 · 0 评论 -
Semaphore
Semaphore是JDK1.5位于java.util.concurrent包下的一个计数信号量。Semaphore通常用于限制可以访问某些资源的线程数目。它内部维护了一个许可集。在许可可用之前会阻塞每一个acquire(),然后再获取该许可;每个release()可以添加一个许可,从而可能释放一个正在阻塞的获得者。 Semaphore有两个构造器,Semaphore(int pe...原创 2018-03-07 20:57:25 · 323 阅读 · 0 评论 -
生产者消费者模式之BlockingQueue
前两篇关于生产者消费者模式的文章(《生产者消费者模式之synchronized与Object》,《生产者消费者模式之Lock与Condition》)介绍的都是比较传统的等待唤醒机制,即缓冲区有资源的时候就唤醒消费者消费,否则消费者就等待;缓冲区空的时候就唤醒生产者生产,否则生产者就等待。在这种机制下缓冲区最多只有一个资源供消费者消费,而且需要我们手动的控制等待和唤醒,比较麻烦,也容易出错。...原创 2018-02-15 23:03:20 · 362 阅读 · 0 评论 -
Condition
在上一篇博客《生产者消费者模式之Lock与Condition》中已经对Condition的使用有所了解了,下面再举一个之前在网上看过的例子作为Condition的补充。 问题:假设有三个线程,一个主线程mainThread和两个子线程subThread1、subThread2,要求按顺序输出,mainThread先输出1——3,然后subThread1输出4——6,最后sub...原创 2018-02-15 17:49:39 · 1413 阅读 · 0 评论 -
生产者消费者模式之Lock与Condition
在synchronized中解决线程间通信的生产者消费者问题可以使用Object类的wait()和notify()/notifyAll()方法(可参考),但是我在《同步之Lock锁》中说过Lock是对synchronized的一种更为面向对象的替代,如果我们使用Lock来解决生产者消费者问题又将怎样编写代码呢?在JDK1.5中提供的Condition配套Lock可以实现相同的功能,...原创 2018-02-15 17:26:24 · 727 阅读 · 0 评论 -
生产者消费者模式之synchronized与Object
我在《同步之synchronized关键字》中举了一个春运卖票的例子,在这个例子中实现了使用线程来同时运行多个任务时,通过使用锁(互斥)来同步两个任务的行为,从而使得一个线程不会干涉另一个线程的资源。也就是说,如果两个线程在交替着步入某项共享资源,可以使用互斥来使得任意时刻只有一个线程可以访问这项资源。 虽然这个问题已经得到了解决,但是现实中卖票应该是这样的:首先先产生了票,然后才...原创 2018-02-15 16:32:40 · 726 阅读 · 0 评论 -
死锁
前面说过使用同步机制可以解决多线程安全问题,不过使用同步也是有代价的,比如有如下两个缺点:1、效率低下;2、在有同步嵌套的时候容易出现死锁。那么什么是死锁呢?死锁就是指有两个或多个线程在相互争夺资源的过程中发生的一种相互等待的现象。 java中发生死锁有如下四个必要条件: 1、互斥使用,即当资源被一个线程占有时。别的线程不能使用; 2、不可抢占,资源请求...原创 2018-02-15 12:22:01 · 265 阅读 · 0 评论 -
同步之Lock锁
我在同步之synchronized关键字中说过synchronized真正起作用的是锁对象,不过这个“锁对象”却是隐式监视器锁,我们并不明确是在哪里加上了锁,在哪里释放了锁。为了更明确的表示这种锁的使用,我们可以使用JDK1.5提供的Lock。 在API中是这样介绍Lock的:Lock实现提供了比使用synchronized方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构...原创 2018-02-15 11:26:19 · 688 阅读 · 0 评论 -
同步之synchronized关键字
快过年了,相信很多朋友都准备在网上买票然后舒舒服服的回家过年吧,然而抢票难却让大伙都很郁闷。前几天跟一个在广州工作的朋友聊天的时候,他还说因为买不到高铁票而要骑自行车回家呢,虽然也不远,才400多公里,对吧。但不管怎样,中国人的传统,回家团圆。希望大家都能顺顺利利的回家跟家人团聚。 接下来进入正题,谈谈java的同步机制synchronized。在讲之前,让我们先来模拟一下买票情...原创 2018-02-15 02:07:25 · 389 阅读 · 0 评论 -
实现多线程的第三种方式之Callable
前面在《java多线程基础》中说过,实现多线程有两种方式:一种是继承Thread类,另一种是实现Runnable接口。这两种方式中真正起作用的是run方法,不过run方法并没有返回值。如果我们希望任务在完成时能够有返回值,这时就可以使用JDK1.5提供的Callable接口了,Callable是一种具有类型参数的泛型,它的类型参数表示的是从call()方法中返回的值,可以使用Executo...原创 2018-02-14 21:39:17 · 443 阅读 · 0 评论 -
线程池
我在线程组中简单的介绍了线程组,虽然事实证明线程组是一个失败的尝试,不过它却给我们提供了另一种思路,既然可以把线程编组进行统一管理,是不是也可以把线程放在一个池子里供我们使用呢?因为我们知道每次新建一个线程的代价是很大的,要涉及到与操作系统进行交互,资源开销很大,如果使用线程池的话就可以很好的提高性能了。 我们可以这样设计,程序中的线程运行结束后不是马上死亡被gc回收,而是重新回到...原创 2018-02-14 21:16:48 · 207 阅读 · 0 评论 -
线程组
记得我们在上学的时候,每学期上课之前老师都会给我们分组,很明显分组的目的就是为了方便管理。同理,当线程很多的时候我们也可以给线程分组以方便我们对线程的同一管理。 看似有了线程组还是蛮方便的,不过线程组已经过时了,它并没有提供太多有用的功能,而且它提供的许多功能还都是有缺陷的。就像Joshua Bloch(《Effective Java》的作者、java集合框架的创始人)说的:“最好...原创 2018-02-14 19:28:20 · 478 阅读 · 0 评论 -
java多线程基础
本文主要讲java多线程的一些入门知识,包括线程的创建、调度、优先级、等待、休眠、中断及守护线程等...,在讲之前让我们先建立一个“数据字典”以简单了解多线程中出现的一些名词。 进程:进程是系统进行资源分配和调度的基本单位,是操作系统结构的基础。可以简单的理解为运行中的应用程序。 多进程:允许计算机“同时”运行多个进程(应用程序)以提高CPU的利用率。 线程:线程是进程...原创 2018-02-13 22:00:22 · 446 阅读 · 0 评论 -
CountDownLatch
CountDownLatch是JDK1.5位于java.util.concurrent包下的一个同步辅助类,利用它利用实现类似计数器的功能。比如有一个任务A,它要等待其他所有任务执行完毕之后才能执行,这时我们就可以使用CountDownLatch来实现这种功能了。 CountDownLatch只有一个带参的构造器CountDownLatch(int count),其中参数count...原创 2018-03-05 20:56:10 · 349 阅读 · 0 评论