08 2019 档案

摘要:ThreadPoolExecutor类的参数详解: Executors:使用该工具类,创建的线程池,会使用默认的方式创建,此时却是了很多的灵活性。比如说:线程的队列,线程的丢弃……等。 ThreadFactory:创建线程时,设置相应的属性。比如线程名字…… 阅读全文
posted @ 2019-08-18 23:03 陈标 阅读(95) 评论(0) 推荐(0)
摘要:同步容器和并发容器: Vector 线程安全,在方法上加Synchronized ArrayList Collections 工具类 Hashtable 线程安全,在方法上加Synchronized HashMap 并发容器: CopyOnWriteArrayList:当写的时候,就复制。 缺点: 阅读全文
posted @ 2019-08-18 19:59 陈标 阅读(166) 评论(0) 推荐(0)
摘要:Future : 提前完成任务 原理:wait(),notify()的使用。 线程之间的通信 : CountDownLatch :线程计数 CyclicBarrier :循环计数 Semaphore : 信号量,比如有100个线程,但是只有10个信号量,那么就每个批次执行10个,“批次”。 Exch 阅读全文
posted @ 2019-08-18 17:05 陈标 阅读(208) 评论(0) 推荐(0)
摘要:condition 的作用:条件锁 需求: 按需执行三个线程。 用wait,notify的方式: 缺点: notifyAll,会唤醒所有等待的线程,不能指定特定线程的唤醒。此时就引入了condition 用condition的方式来实现: 阅读全文
posted @ 2019-08-18 00:09 陈标 阅读(590) 评论(0) 推荐(0)
摘要:重点: 1、读锁共享 2、写锁互斥 3、读写锁互斥 锁降级:将写锁降级为读锁。(先获取写锁,再获取读锁,再释放写锁,最后释放读锁) 造成锁降级的原因:出于性能考虑,一般情况下,都将锁定的动作,精确到具体的语句块,在两个锁的语句块之间,有可能线程的交替执行,造成线程安全问题。 解决的方法: 1、将锁的 阅读全文
posted @ 2019-08-17 00:06 陈标 阅读(221) 评论(0) 推荐(0)
摘要:何为公平锁: 线程的运行,根据线程的提交(start() 方法的调用时间点),依次执行。 公平锁实现的原理: 1、使用链表来维护数据。(方便获取头节点) 2、当一个线程过来,就创建一个节点,节点中存放的内容为,wait()的对象。 3、当上一个线程结束,则获取头节点,获取节点中存放的对象,调用对象的 阅读全文
posted @ 2019-08-16 07:53 陈标 阅读(233) 评论(0) 推荐(0)
摘要:AbstractQueuedSynchronizer 是一个锁框架。实现的原理(大概): 1、关于重入锁方面的实现,参考(手写一个可重入锁)。 2、关于公平锁方面的实现,使用双链表的形式,进行公平锁的排队。怎么用: 详见AbstractQueuedSynchronizer的api,或者参考:Reen 阅读全文
posted @ 2019-08-16 06:34 陈标 阅读(92) 评论(0) 推荐(0)
摘要:基于的原理: 1、synchronized 2、wait,notify方法的搭配使用 代码示例如下: 阅读全文
posted @ 2019-08-16 05:19 陈标 阅读(357) 评论(0) 推荐(0)
摘要:从语义方面解析为什么需要锁: 1、wait()方法会释放锁,如果没有先获得锁,那么如何释放? 从实际的作用: 为了预防饥饿线程的产生。 原因: 现在考虑, 如果wait() 和 notify() 的操作没有相应的同步机制, 则会发生如下情况 【线程A】 进入了 while 循环后(通过了 !cond 阅读全文
posted @ 2019-08-16 04:19 陈标 阅读(2444) 评论(0) 推荐(0)
摘要:问题: 1、线程的中断方式。 2、为什么中断阻塞中的线程,会抛出异常。 代码示例: 解答问题: 1、线程的中断,使用设置中断标示的方式进行。 2、中断阻塞中的线程抛出异常,是为了不让线程无休止的中断。因为设置中断标示,线程并不会马上停止,还需要等待下一次的CPU时间片到来,才能根据interrupt 阅读全文
posted @ 2019-08-16 04:18 陈标 阅读(2927) 评论(0) 推荐(0)
摘要:并发 活跃性问题: 1、死锁:线程A,B各种拥有一个加锁的资源,同时争抢对方的资源。 2、饥饿:某些线程得不到运行。(线程优先级) 3、活锁:线程A,B相让,都不去执行。 饥饿产生的情况: 1、线程优先级。(需要考虑系统的差异性) 2、线程A,B执行同一个同步块;线程A阻塞,线程B在等待A释放锁。 阅读全文
posted @ 2019-08-16 04:17 陈标 阅读(141) 评论(0) 推荐(0)
摘要:基于的原理: 1、两阶段提交 2、定时事务状态回查。 阅读全文
posted @ 2019-08-15 05:53 陈标 阅读(125) 评论(0) 推荐(0)
摘要:问题描述: 1、系统偶发性抛出异常:java.lang.NumberFormatException: multiple points ,追溯源头抛出的类为:SimpleDateFormat 问题的定位: 1、总所周知,SimpleDateFormat是非线程安全的类。由此可以推断:在多线程环境下,需 阅读全文
posted @ 2019-08-14 11:58 陈标 阅读(189) 评论(0) 推荐(0)
摘要:问题描述: 1、系统在执行某个操作时,必现OOM异常。 问题的定位: 1、排查代码,未发现问题。 2、在虚拟机启动时,添加参数:-XX:+HeapDumpOnOutOfMemoryError(当发生oom异常时,生成dump文件),得到异常时的dump文件。 3、使用 jvisualvm 分析dum 阅读全文
posted @ 2019-08-14 11:12 陈标 阅读(222) 评论(0) 推荐(0)
摘要:jps (java process status) == ps / top 作用:显示所有运行中的java进程。 jstat 作用:查看类装载,内存,垃圾收集,jit编译的信息。 jinfo 作用:实时查看和调整虚拟机的各项参数。 jmap 作用:dump文件的生成(瞬时状态)。 jstack 作用 阅读全文
posted @ 2019-08-14 10:57 陈标 阅读(126) 评论(0) 推荐(0)
摘要:死锁的产生: 1、两个线程,各自拥有一个加锁的资源,同时都想获取对方手中的资源。 代码示例: 死锁的定位:jconsole 由上图可以发现,我们创建的线程A,B都处在阻塞状态。 点击 “检测死锁” 按钮,即可定位死锁发生的地方,如下图: 阅读全文
posted @ 2019-08-14 10:13 陈标 阅读(449) 评论(0) 推荐(0)
摘要:TCP基于链接的协议,并且保证有序性。 但是,每个包的长度,需要明确,否则会发生粘包现象。 以下示例为一个自定义协议的例子,其中包含了拆包的内容。 所有的类: 协议类: 解码器类: 编码器类: 服务器处理类: 客户端处理类: 服务端启动类: 客户端启动类: 运行服务端,再运行客户端,即可完成测试。 阅读全文
posted @ 2019-08-12 04:13 陈标 阅读(161) 评论(0) 推荐(0)
摘要:编解码器的基类: 编码:MessageToByteEncode 解码:ByteToMessageDecoder 阅读全文
posted @ 2019-08-12 01:33 陈标 阅读(184) 评论(0) 推荐(0)
摘要:为什么有了AtomicInteger还需要AtomicIntegerFieldUpdater? 当需要进行原子限定的属性所属的类会被创建大量的实例对象, 如果用AtomicInteger, 每个实例里面都要创建AtomicInteger对象, 从而多出内存消耗.显然是不合适的。 因此出现了Atomi 阅读全文
posted @ 2019-08-11 23:18 陈标 阅读(393) 评论(0) 推荐(0)
摘要:Nio 的ByteBuffer 和 Netty 的 ByteBuf 的区别: 1、ByteBuf 将 ByteBuffer的position 分解为:readIndex , writeIndex 因此,使用ByteBuf 就不再需要使用 filp 进行读写状态的切换,随时可以进行读写。 2、jdk 阅读全文
posted @ 2019-08-11 22:18 陈标 阅读(272) 评论(0) 推荐(0)
摘要: 阅读全文
posted @ 2019-08-11 20:31 陈标 阅读(179) 评论(0) 推荐(0)
摘要:Pipeline 过滤器链,分入过滤器,出过滤器,出入过滤器。 出过滤器:*Outbound* 入过滤器:*Inbound* 出入过滤器:** 区别于springMVC的过滤器,springMVC仅仅有出入过滤器。要区分出,入过滤器,需要手工处理,类似于代理模式中,将具体执行代码的位置。 { 过滤器 阅读全文
posted @ 2019-08-11 01:10 陈标 阅读(143) 评论(0) 推荐(0)
摘要:Netty中的模型: 阅读全文
posted @ 2019-08-11 00:36 陈标 阅读(106) 评论(0) 推荐(0)
摘要:AdaptiveRecvByteBufAllocator 动态分配buffer大小的类。 如果前一次读取完全填满了分配的缓冲区,它将逐渐增加预期的可读字节数。(增加的方式:初始化类的时候,会预先设置好可以动态增加的值,代码如下:) 数组内存放的值:小于512的值,两个数的差值为16;大于512,值左 阅读全文
posted @ 2019-08-10 22:31 陈标 阅读(374) 评论(0) 推荐(0)
摘要:祭图: 说白了,就是发布订阅模式。 阅读全文
posted @ 2019-08-10 10:07 陈标 阅读(95) 评论(0) 推荐(0)
摘要:设计模式:命令模式 重点: 传递命令,执行器执行命令。 线程类:Executor 就是使用的命令模式。 源码: public interface Executor { void execute(Runnable command); } 额外的话题: 线程工厂的意义: 解耦 原有的创建线程方式:创建线 阅读全文
posted @ 2019-08-10 08:46 陈标 阅读(97) 评论(0) 推荐(0)
摘要:所有的文件存储 >字节 字节(byte) --(编码)-- > 字符 (char) 字节(byte) < --(解码)-- 字符 (char) 字节:跟机器打交道。 字符:跟人打交道。 乱码的本质原因:编码、解码不一致。 ASCII (American Standard Code For Infor 阅读全文
posted @ 2019-08-09 21:46 陈标 阅读(207) 评论(0) 推荐(0)
摘要:实现的功能: 运行一个服务端,运行多个客户端。在客户端1,发送消息,其余客户端都能收到客户端1发送的消息。 重点: 1、ByteBuffer在使用时,注意flip()方法的调用,否则读取不到消息。 服务端 客户端 阅读全文
posted @ 2019-08-09 15:50 陈标 阅读(577) 评论(0) 推荐(0)
摘要:重点: 1、0拷贝需要系统支持。 普通内存模型: java线程内存 --> 操作系统内存 --> 硬盘 直接内存模型: java --> 操作系统内存 --> 硬盘 两者对比,少了一步:直接内存直接操作系统内存,少了java线程内存到操作系统内存拷贝的这一步,所以提升了效率。 代码: java.ni 阅读全文
posted @ 2019-08-09 00:25 陈标 阅读(1107) 评论(0) 推荐(0)
摘要: 阅读全文
posted @ 2019-08-08 20:29 陈标 阅读(87) 评论(0) 推荐(0)
摘要:重点: 1、动态扩展对象,替换之前需要继承才能实现的功能。 2、具体工作的,仍然是被包装的对象,(有点锦上添花的意思,顾名思义仅仅起到装饰的作用,主体不变)。 对比继承: 1、减少类的数量。 如果使用继承的方式,每一个对应的类,都需要有相应的子类,才能完成对应的功能。 如果使用装饰者模式,同一个接口 阅读全文
posted @ 2019-08-08 19:44 陈标 阅读(701) 评论(0) 推荐(0)
摘要:是什么: 一个RPC框架。 阅读全文
posted @ 2019-08-08 03:24 陈标 阅读(357) 评论(0) 推荐(0)
摘要:重点是: 1、枚举DataType的定义 2、oneof的使用 阅读全文
posted @ 2019-08-08 03:07 陈标 阅读(1183) 评论(0) 推荐(0)