多线程编程
文章平均质量分 92
小狼_百度
百度,web系统,分布式系统,大数据,机器学习,人工智能等爱好者
展开
-
Java多线程设计模式:wait/notify机制
通常,多线程之间需要协调工作。例如,浏览器的一个显示图片的线程displayThread想要执行显示图片的任务,必须等待下载线程downloadThread将该图片下载完毕。如果图片还没有下载完,displayThread可以暂停,当downloadThread完成了任务后,再通知displayThread“图片准备完毕,可以显示了”,这时,displayThread继续执行。 以上逻辑转载 2008-09-22 10:41:00 · 669 阅读 · 0 评论 -
Java进阶(四)线程间通信剖析
CountDownLatchCountDownLatch适用场景Java多线程编程中经常会碰到这样一种场景——某个线程需要等待一个或多个线程操作结束(或达到某种状态)才开始执行。比如开发一个并发测试工具时,主线程需要等到所有测试线程均执行完成再开始统计总共耗费的时间,此时可以通过CountDownLatch轻松实现。CountDownLatch实例123转载 2017-06-06 15:20:48 · 300 阅读 · 1 评论 -
Java进阶(三)多线程开发关键技术
本文将介绍Java多线程开发必不可少的锁和同步机制,同时介绍sleep和wait等常用的暂停线程执行的方法,并详述synchronized的几种使用方式,以及Java中的重入锁(ReentrantLock)和读写锁(ReadWriteLock),之后结合实例分析了重入锁条件变量(Condition)的使用技巧,最后介绍了信号量(Semaphore)的适用场景和使用技巧。原创文章,转转载 2017-06-06 15:14:56 · 608 阅读 · 0 评论 -
Java进阶(二)当我们说线程安全时,到底在说什么
提到线程安全,可能大家的第一反应是要确保接口对共享变量的操作要具体原子性。实际上,在多线程编程中我们需要同时关注可见性、顺序性和原子性问题。本篇文章将从这三个问题出发,结合实例详解volatile如何保证可见性及一定程序上保证顺序性,同时例讲synchronized如何同时保证可见性和原子性,最后对比volatile和synchronized的适用场景。原创文章,转载请务必将下面这转载 2017-06-06 15:08:27 · 378 阅读 · 0 评论 -
wait时间到或被中断唤醒时,仍然需要等待获取锁。
Java代码 import java.io.IOException; public class Demo { /** * @param args * @throws IOException * @throws InterruptedException * @throws ClassNotFoundException转载 2014-12-11 17:40:37 · 4440 阅读 · 0 评论 -
如何使用Disruptor(一)Ringbuffer的特别
最近,我们开源了LMAX Disruptor, 它是我们的交易系统吞吐量快(LMAX是一个新型的交易平台,号称能够单线程每秒处理数百万的订单)的关键原因。为什么我们要将其开源?我们意识到对高性 能编程领域的一些传统观点,有点不对劲。我们找到了一种更好、更快地在线程间共享数据的方法,如果不公开于业界共享的话,那未免太自私了。同时开源也让我 们觉得看起来更酷。从这个站点,你可以下载到一篇解释什转载 2014-08-07 15:07:45 · 1390 阅读 · 0 评论 -
并发框架Disruptor译文
Martin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易。这个系统是建立在JVM平台上,其核心是一个业务逻辑处理器,它能够在一个线程里每秒处理6百万订单。业务逻辑处理器完全是运行在内存中,使用事件源驱动方式。业务逻辑处理器的核心是Disruptor。Disruptor它是一个开源的并发框架,并获得201转载 2014-08-06 17:22:55 · 1076 阅读 · 0 评论 -
Java 理论与实践: 正确使用 Volatile 变量
Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是synchronized 的一部分。本文介绍了几种有效使用 volatile 变量的模式,并强调了几种不适合使用 volatile 变量的情形。锁提供了两种主要特性:转载 2014-08-07 17:13:39 · 628 阅读 · 0 评论 -
如何使用 Disruptor(三)写入 Ringbuffer
本文的重点是:不要让 Ring 重叠;如何通知消费者;生产者一端的批处理;以及多个生产者如何协同工作。AD:这是 Disruptor 全方位解析(end-to-end view)中缺少的一章。当心,本文非常长。但是为了让你能联系上下文阅读,我还是决定把它们写进一篇博客里。本文的 重点 是:不要让 Ring 重叠;如何通知消费者;生产者一端的批处理;以转载 2014-08-07 15:09:48 · 1167 阅读 · 0 评论 -
如何使用Disruptor(二)从Ringbuffer读取
从上一篇文章中我们都了解了什么是Ring Buffer以及它是如何的特别。但遗憾的是,我还没有讲述如何使用Disruptor向Ring Buffer写数据和从Ring Buffer中读取数据。ConsumerBarrier与消费者这里我要稍微反过来介绍,因为总的来说读取数据这一过程比写数据要容易理解。假设通过一些“魔法”已经把数据写入到Ring Buffer了,怎样从Rin转载 2014-08-07 15:06:26 · 849 阅读 · 0 评论 -
JAVA ThreadPoolExecutor详解
基础 在我看来,java比C++的一个大好处就是提供了对多线程的支持(C++只有多线程的库,语言本身不包含线程的概念)。而其中我最爱用的就是ThreadPoolExecutor这个类,它实现了一个非常棒的thread pool。thread pool一般被用来解决两个问题:当处理大量的同步task的时候,它能够避免thread不断创建销毁的开销;而另外一个也许更重要的含义是,它其实表转载 2014-06-27 11:16:55 · 1151 阅读 · 0 评论 -
Runnable、Callable、Executor、Future、FutureTask关系解读
在再度温习Java5的并发编程的知识点时发现,首要的就是把Runnable、Callable、Executor、Future等的关系搞明白,遂有了下述小测试程序,通过这个例子上述三者的关系就一目了然了。在java5以后,一个可以调度执行的线程单元可以有三种方式定义:Thread、Runnable、Callable,其中Runnable实现的是void run()方法,Callable实现的转载 2013-10-15 11:47:41 · 1023 阅读 · 0 评论 -
JAVA 对象池
Jakarta对象池 ☆为什么使用对象池 恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消耗,提高系统的运行效率。Jakarta Commons Pool组件提供了一整套用于实现对象池化的框架,以及若干种各具特色的对象池实现 ☆对象池思路 对象池化的基本思路是:将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复转载 2012-11-26 17:05:23 · 1163 阅读 · 0 评论 -
Runtime中 shutdown hook的用法
根据 Java API, 所谓 shutdown hook 就是已经初始化但尚未开始执行的线程对象。在Runtime 注册后,如果 jvm 要停止前,这些 shutdown hook 便开始执行。声明:Runtime.addShutdownHook(Thread t)举例如下:package john2; /** * test shutdown hook * All right转载 2012-04-06 10:16:24 · 7135 阅读 · 0 评论 -
類別 ThreadPoolExecutor
public class ThreadPoolExecutorextends AbstractExecutorService一個 ExecutorService,它使用可能的幾個池執行緒之一執行每個提交的任務,通常使用 Executors 處理器方法配置。 執行緒池可以解決兩個不同問題:由於減少了每個任務調用的開銷,它們通常可以在執行大量非同步任務時提供增強的性能,並且還可转载 2012-01-13 14:36:19 · 5333 阅读 · 0 评论 -
对Java多线程技术中所有方法的详细解析
一、run()和start() 这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由Java的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void。 二、关键字Synchronized 这个关键字用于保护共享数据,当然前提是要分清哪些数据是共享数据。每个对象都有一个锁标志,当一个线转载 2008-09-22 10:59:00 · 732 阅读 · 0 评论 -
单个JVM下支撑100w线程数
I、环境要求:1.64bit Linux2.64bit JDK3.Memory够大,512GB4.cpu:64 processorsII、测试工具:【DieLikeADog.java】java -server -Xmx6G -Xms6G -Xmn600M -Xss228K -XX:PermSize=50M -XX:MaxPermSize=50M -X转载 2017-07-04 14:26:52 · 610 阅读 · 0 评论