• 013
    2018-11-29
    1)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同:
    CountDownLatch一般用于某个线程A等待若干个其他线程执行完任务之后,它才执行;
    而CyclicBarrier一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行;
    另外,CountDownLatch是不能够重用的,而CyclicBarrier是可以重用的。
    2)Semaphore其实和锁有点类似,它一般用于控制对某组资源的访问权限。

    作者回复: 不错

    
     36
  • 天秤座的选择
    2018-06-20
    做android的,一个页面有A,B,C三个网络请求,其中请求C需要请求A和请求B的返回数据作为参数,用过CountdownLatch解决。
     1
     36
  • Daydayup
    2018-06-22
    CountDownLatch最近还真用上了。我的需求是每个对象一个线程,分别在每个线程里计算各自的数据,最终等到所有线程计算完毕,我还需要将每个有共通的对象进行合并,所以用它很合适。

    作者回复: 合适的场景

     1
     24
  • Jerry银银
    2018-06-20
    对于Java 并发包提供了哪些并发工具类,我是这么理解的:
    1. 执行任务,需要对应的执行框架(Executors);
    2. 多个任务被同时执行时,需要协调,这就需要Lock、闭锁、栅栏、信号量、阻塞队列;
    3. Java程序中充满了对象,在并发场景中当然避免不了遇到同种类型的N个对象,而对象需要被存储,这需要高效的线程安全的容器类
    
     16
  • 夏天🔆
    2018-06-20
    以前使用coutdownlatch进行并发异常的模拟,来修改bug,具体是在发生异常的错误堆栈上进行await,在某些条件处或触发点进行coutdown,来尽可能模拟触发异常时的场景,很多可以必现,修改之后没有问题,才算解决一个并发异常
    
     9
  • THROW
    2018-06-20
    ArrayBlockingQueue使用了两个condition来分别控制put和take的阻塞与唤醒,但是我在想好像只用一个condition也可以,因为put和take只会有一个是处于阻塞等待状态。所以设计成两个condition 的原因是什么呢?只是为了提高可读性么?
    
     6
  • xuery
    2018-10-03
    最近有用到countDownLatch,一个批量更新接口,采用多线程提高处理速度,全部处理完将结果封装返回给app端

    作者回复: 是个应用频率高的同步工具

    
     5
  • 石头狮子
    2018-06-20
    列举实践中两个应用并发工具的场景:
    1. 请求熔断器,使用 Semaphore 熔断某些请求线程,待系统恢复以后再逐步释放信号量。
    2. Worker 搜索停止标志。使用 countdownlatch 标记 Worker 找到的结果个数,达到结果后其他线程不再继续执行。
    
     5
  • 扫地僧的功夫梦
    2018-06-19
    17讲的问题,留言有点晚,老师可能不会看,想得到老师的回复:调用notify()/notifyAll()方法后线程是处于阻塞状态吧,因为线程还没获取到锁。

    作者回复: 是说调用notify的那个线程的状态吗?
    不是的,这里有很多方面:
    阻塞一般发生在进入同步块儿时;
    notify并不会让出当前的monitor;
    可以用wait释放锁,但是进入waiting状态。

    不建议靠记忆去学习,类似问题我建议思考一下:能不能用一段程序验证,需不需要利用什么工具;别忘了从Javadoc得到初步信息

    授人以渔比提供答案更重要,最好不要你怀疑我这里的每个结论,自己写代码去玩玩

    
     5
  • Phoenix
    2018-11-11
    经过老师的讲解,我对CountDownLatch的使用场景是这样理解的:
    1:A线程的执行,依赖与B线程或C线程等等其他多个线程任务的执行结果来触发A线程任务执行事件

    作者回复: 不错

    
     4
  • feifei
    2018-08-03
    我的使用经验,在进行高并发的测试时,我会使用countdownlatch,将所有的工作线程在开始时等待,然后在统一的开始,这样就可以避免创建线程所需的时间开销,更好的模拟高并发
    
     4
  • 如风
    2018-06-20
    在写爬虫时,使用过 Semaphore ,来控制最多爬同一个域名下的 url 数量。
    
     4
  • 三个石头
    2018-06-19
    你用的Semaphore第二个例子,构造函数中为啥为0,信号量不是非负整数吗?
    
     4
  • 扫地僧的功夫梦
    2018-06-20
    谢谢老师的回复,还是notify()/notifyAll()问题,我想说的是被唤醒的线程再重新获取锁之前应该是阻塞状态吧。
    
     3
  • Leiy
    2018-06-19
    对于CopyOnWriteArrayList,适用于读多写少的场景,这个比较好理解,但是在实际使用时候,读写比占多少时候,可以使用?心里还是没数,这个怎么去衡量?
    
     2
  • 天王
    2020-01-03
    19 java并发包提供了哪些工具类 1 Java.util.concurrent及其子包,包含了java的各种并发工具类 1.1 提供了比synchronized更高级的同步结构 ,包括CountDownLatch,CyclicBarrier,Semaphore,可以实现更加丰富的线程操作 1.2 各种线程安全的容器 ConcurrentHashMap,ConcurrentSkipListMap,线程安全的数组 CopyOnWriteArrayList 1.3 各种并发队列BlockingQueue实现 ,比如ArrayBlockingQueue,SynchronousQueue或针对特定场景的PriorityBlockingQueue,1.4 强大的executor框架,可以创建不同类型的线程池和调度任务,不用自己创建。2 并发类的实际应用 CountDownLatch 允许一个或者多个线程等待某些操作完成,CyclicBarrier,允许多个线程等待达到某个屏障 ,Semphore java版本的信号量实现,2.1 Semphore通过限制一定数量的多个permit的方式,来达到限制统一资源访问的目的,Semphore是通过acquire和release,如果初始值设置为1,则1个线程通过acquire进入互斥状态,2.2 CountDownLatch和CyclicBarrier区别 CountDownLatch是不可以被重置的,CuclicBarrier可以被重置,CountDownLatch的基本操作组合是countdown/await,调用 await的线程阻塞等待countDown足够的次数,不管一个还是多个线程,足够的次数即可。CyclicBarrier的组合就是await,当所有的伙伴都调用完了await,才会继续进行任务,并进行重置。CyclicBarrier 侧重的是线程,典型应用场景是等待比并发线程结束。Cyclic反应的是线程并发运行时的协调
    展开
    
     1
  • QQ怪
    2019-04-01
    一般用CountDownLatch来提高接口访问速度,不知道这样符不符合规范😂😂😂
    
     1
  • clz1341521
    2018-08-06
    我的应用场景是异步发送一定数量的http消息,主线程等待 所有发送完毕,获取所有的发送成功数
    
     1
  • xinxin💛
    2018-07-07
    老师为什么我用ConcurrentHashMap执行remove操作的时候cpu总是跳得很高,hashmap就还好没那么夸张。。现在为了线程安全还是用ConcurrentHashMap,但执行remove操作的线程一多经常就卡死了。

    作者回复: 你是什么版本jdk?

    
     1
  • jacy
    2018-06-25
    感觉CountDownLatch有点像c++中的条件锁,想问一下老师,可否给点从c++转java的建议。

    作者回复: 这个...经验谈不上,我也没这经验;或者你可以对比二者的区别,加深理解;
    为什么转?希望达到什么目标?

    
     1
我们在线,来聊聊吧