线程

Kafka技术内幕——图文详解Kafka源码设计与实现

让人想犯罪 __ 提交于 2020-03-24 16:50:52
3 月,跳不动了?>>> 引言 Apache Kafka (简称Kafka )最早是由LinkedIn开源出来的分布式消息系统,现在是Apache旗下的一个子项目,并且已经成为开源领域应用最广泛的消息系统之一。Kafka社区 也非常活跃,从0.9版本开始,Kafka的标语已经从“一个高吞吐量、分布式的消息系统”改为“一个分布式的流平台”。Kafka自LinkedIn 开源以来就以高性能、高吞吐量、分布式的特性著称。本书以0.10版本的源码为基础,深入分析了Kafka 的设计与实现,包括生产者和消费者的消息处理流程,新旧消费者不同的设计方式,存储层的实现,协调者和控制器如何确保Kafka集群的分布式和容错特性,两种同步集群工具MirrorMaker和uReplicator,流处理的两种API以及Kafka的些高级特性等 。本书适合Kafka开发人员阅读。 书本主页 书本目录 生产者 :从一个生产者的示例开始,引出了新版本生产者的两种消息发送方式。生产者客户端通过记录收集器和发送线程,对消息集进行分组和缓存,并为目标节点创建生产请求,发送到不同的代理节点。接着介绍了与网络相关的Kafka通道、选择器、轮询等NIO操作。另外,还介绍了Scala版本的旧生产者,它使用阻塞通道的方式发送请求。最后,介绍了服务端采用 Reactor模式处理客户端的请求。 消费者:高级API和低级API

大牛都在用的IDEA调试技巧

隐身守侯 提交于 2020-03-24 13:50:20
导读 文章转载自 https://mp.weixin.qq.com/s?__biz=MzI0ODYzMzIwOA==&mid=2247483950&idx=1&sn=22547fb4e1d21851b4d3a1c90e2e7aa3&chksm=e99c8039deeb092f09e716c66af31a4a08dfb918ff201e03778f01ac11b520006fc18e2f0fe9&scene=126&sessionid=1585026418&key=eadb0cb5ef4c1752272952c6f598727fa3f5acf307757ea9d6e2fd02c6f8fe21e7559fb168c6f36eaf3ba9278442bee1db07fc53ad550176a2e79fa3f9a5f460e97d6ccb6826df5c0c56723510258973&ascene=1&uin=MTA3MjI0MTk2&devicetype=Windows+10&version=62080079&lang=zh_CN&exportkey=Ac%2Fs4sUzw9sFrOJ9Y2e4SNg%3D&pass_ticket=fuWdYFindcdGpF10fnKSlQa5NqflzhdeQ6SAdKKpNo0%3D 前天面试了一个985高校的实习生,问了他平时用什么开发工具

JVM源码分析之javaagent原理完全解读

帅比萌擦擦* 提交于 2020-03-24 12:22:05
问题描述 当我们一个系统既需要mysql驱动,也需要oracle驱动的时候,在并发加载初始化这些驱动类的过程中产生死锁的可能性非常大,下面是一个模拟的例子,对于Thread2的实现其实是jdk里java.sql.DriverService的逻辑,也是我们第一次调用java.sql.DriverManager.registerDriver注册一个驱动实例要走的逻辑(jdk1.6下),不过这篇文章是使用我们生产环境的一个系统的线程dump和内存dump为基础进行分析展开的。 如果以上代码运行过程中发现有线程一直卡死在Class.forName的调用里,那么说明问题已经重现了。 先上两张图 内存态线程堆栈 线程堆栈 存疑点 仔细看看上面的线程dump分析和内存dump分析里的线程分析模块,您可能会有如下两个疑惑: 【为什么线程[Thread-0]一直卡在Class.forName的位置】:这有点出乎意料,做一个类加载要么找不到抛出ClassNotFoundException,要么找到直接返回,为什么会一直卡在这个位置呢? 【明明[Thread-0]注册的是mysql驱动为什么会去加载Odbc的驱动类】:通过[Thread-0]在栈上看倒数第二帧展开看到传入Class.forName的参数是com.mysql.jdbc.Driver,然后展开栈上顺序第二帧,看到传入的参数是sun.jdbc

java中volatile关键字的含义

主宰稳场 提交于 2020-03-24 12:01:31
From: http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉。 Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制。 synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和 块语句,在多线程访问的时候,同一时刻只能有一个线程能够用 synchronized 修饰的方法 或者 代码块。 volatile 用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最的值。volatile很容易被误用,用来进行原子性操作。 下面看一个例子,我们实现一个计数器,每次线程启动的时候,会调用计数器inc方法,对计数器进行加一 执行环境——jdk版本:jdk1.6.0_31 ,内存 :3G cpu:x86 2.4G 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 public class Counter

Invoke and BeginInvoke

两盒软妹~` 提交于 2020-03-24 11:48:46
在Invoke或者BeginInvoke的使用中无一例外地使用了委托Delegate。 一、为什么Control类提供了Invoke和BeginInvoke机制? 关于这个问题的最主要的原因已经是dotnet程序员众所周知的,我在此费点笔墨再次记录到自己的日志,以便日后提醒一下自己。 1、windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着一个消息泵。这个消息泵让windows程序生生不息。 Windows GUI程序的消息循环 Windows程序有个消息队列,窗体上的所有消息是这个队列里面消息的最主要来源。这里的while循环使用了GetMessage()这个方法,这是个阻塞方法,也就是队列为空时方法就会被阻塞,从而这个while循环停止运动,这避免了一个程序把cpu无缘无故地耗尽,让其它程序难以得到响应。当然在某些需要cpu最大限度运动的程序里面就可以使用另外的方法,例如某些3d游戏或者及时战略游戏中,一般会使用PeekMessage()这个方法,它不会被windows阻塞,从而保证整个游戏的流畅和比较高的帧速。 这个主线程维护着整个窗体以及上面的子控件。当它得到一个消息,就会调用DispatchMessage方法派遣消息,这会引起对窗体上的窗口过程的调用。窗口过程里面当然是程序员提供的窗体数据更新代码和其它代码。 2

理解JVM的GC机制之JVM内存划分

一世执手 提交于 2020-03-24 10:26:19
前言 什么是JVM的GC,GC(Garbage Collection)也就是垃圾回收是JVM在内存空间不足等必要条件下自动清除应用程序中的垃圾对象,回收垃圾对象占用的内存空间。 JVM的GC机制使得开发者从繁琐的内存管理中释放出来,只需要专注于业务开发。但即便如此,这并不意味着我们可以不用去理解GC的原理,如果不了解GC原理的话,那么当我们在实际工作中遇到了内存泄漏、频繁GC导致应用性能低下的问题时往往会变得束手无措,为了能够快速排查问题、解决性能瓶颈,我们需要对GC原理有所了解。 想要了解GC原理,我们需要先了解JVM内存管理机制,了解JVM中内存的划分,这样才能更好的了解垃圾回收是回收的是哪些区域的垃圾对象,什么时候回收以及怎么回收。 JVM的内存管理 根据JVM规范( 这里及下文的规范均为Java8的规范 ),JVM把内存划分成了几个不同的区域: 程序计数器(线程独享) 方法区(线程共享) 堆区(线程共享) 虚拟机栈(线程独享) 本地方法栈(线程独享) 其中,方法区和堆区为所有线程共用的数据区域,程序计数器、虚拟机栈、本地方法栈为各个线程独有的区域,不同的区域作用不尽相同。 对于线程独享的区域,区域创建于线程创建之时,销毁于线程退出之时。对于线程共享的区域,区域创建于虚拟机启动之时,销毁于虚拟机退出之时。 # 程序计数器 程序计数器为 线程独享 区域

BlockingQueue(阻塞队列)详解

*爱你&永不变心* 提交于 2020-03-24 10:02:50
注意:该随笔内容完全引自http://wsmajunfeng.iteye.com/blog/1629354,写的很好,非常感谢,复制过来算是个积累,怕以后找不到。 一. 前言   在新增的Concurrent包中,BlockingQueue很好的解决了多线程中,如何高效安全“传输”数据的问题。通过这些高效并且线程安全的队列类,为我们快速搭建高质量的多线程程序带来极大的便利。本文详细介绍了BlockingQueue家庭中的所有成员,包括他们各自的功能以及常见使用场景。 二. 认识BlockingQueue   阻塞队列,顾名思义,首先它是一个队列,而一个队列在数据结构中所起的作用大致如下图所示:   从上图我们可以很清楚看到,通过一个共享的队列,可以使得数据由队列的一端输入,从另外一端输出;   常用的队列主要有以下两种:(当然通过不同的实现方式,还可以延伸出很多不同类型的队列,DelayQueue就是其中的一种)     先进先出(FIFO):先插入的队列的元素也最先出队列,类似于排队的功能。从某种程度上来说这种队列也体现了一种公平性。     后进先出(LIFO):后插入队列的元素最先出队列,这种队列优先处理最近发生的事件。   多线程环境中,通过队列可以很容易实现数据共享,比如经典的“生产者”和“消费者”模型中,通过队列可以很便利地实现两者之间的数据共享

线程锁是怎么回事?

时间秒杀一切 提交于 2020-03-24 07:38:59
内容衔接:   咱们要明白一件事就是我们现在在这里讲的锁跟前面所说的GIL锁不是一个锁,前面说的GIL锁 是Python内置的一个全局解释器,这个锁的目的就是保证在同一时刻进程中只有一个线程可以被CPU 调度.   但是我们也说了这个GIL锁有的时候并不能更快解决我们把语言翻译出来的目的,那比如说在密集 型计算问题的时候,反而会比较慢,那有的人就说了,那为什么不把这锁给去了?   这个问题我其实也一直在纠结,存在即合理,那么站在可观的角度去看这个问题,应该能给你解答 那么在Python开始被程序员使用的时候也有的就提出了这样的文问题,那么Python 的创始人的团队 也就在处理这个问题,但是当他们按照Java和C#的解决方案去解决这个问题的时候就发现,没有GIL锁 反而比有GIL锁跑的更慢了.所以有改回来了,但是一方面的原因还是因为他们团队代码写的不够好(个人 主见仅供参考)这一直以来成为了Python的一大诟病,但是我相信在Pyhton如此之火的现在而言解决 这个问题就是迟早的事情   扯了这么多,连主题都忘了继续说到我们今天要说的锁的事那么我们今天要说的锁2到底是什么呢> 给你就一个例子,就是说这样一个 场景,比如说我现在有有两个函数;里面都要去调用公共变量的一个 值但是我们运行的时候由于这个GIL锁的原因,我第一个程序还没有将公共变量中值改好但是我的使用 次数已经够了

Java_多线程(1)

ぃ、小莉子 提交于 2020-03-24 07:16:21
前面写了这么多篇java的基础,这篇我们终于进入到了java中比较复杂的部分——java多线程。 什么是线程? 介绍线程之前,我们必须先了解下进程。 进程 :是程序的一次动态执行过程。比如你打开了IE浏览器,从它打开的时刻就启动了一个进程。 多进程 :多进程就像打开了多个程序,比如你边玩QQ,边用网易云听歌,还可以浏览网页,多个任务同时进行。 线程 :比进程更小的执行单位,通常一个进程拥有1-n个线程。 多线程 :指在同一个程序(进程)中能够同时处理多个任务,而这些任务就对应多个线程。比如浏览器可以同时下载多个图片;比如ABC三个用户同时访问淘宝,淘宝的服务器收到A用户的请求后,为A创建了一个线程,BC用户同样拥有自己对应的线程。 注意 :多线程不是为了提高程序的执行速度(甚至降低性能),而是提高应用程序的使用效率。 线程的生命周期? 每一个生命周期也是一种状态。 1)创建:创建一个新的线程对象; 2)就绪:线程对象创建后,其他线程调用了该对象的start()方法,该线程被放入可运行的线程池中,等待获取CPU的使用权; 3)运行:就绪状态的线程获取了CPU,执行; 4)阻塞:由于某种原因,线程暂停; 5)死亡:线程执行完成或异常抛出,该线程生命周期结束。 Java实现多线程: java中实现多线程有两种方法,一种是继承Thread类,一种是实现Runnable接口。 注意:准确来说