随笔分类 -  Java

摘要:记录一下线上机器的JVM参数配置: CATALINA_OPTS="$CATALINA_OPTS -server -Djava.awt.headless=true 6.7补充:之前贴的是web机器的JVM参数配置,看了service的参数配置,稍稍有点不同 web配了新生代1G,老年代1.5G,ser 阅读全文
posted @ 2017-05-31 23:30 Mr.do 阅读(1837) 评论(0) 推荐(0)
摘要:final也是并发中一个常用的tips。JMM中对final提供的重排序规则如下: 1、当在constructor中对final变量写入之前,不会将构造对象的引用给出去。 2、读一个包含final域的对象的引用 happens before 后续对这个final域的读 关于(1),是说当在const 阅读全文
posted @ 2017-04-27 09:16 Mr.do 阅读(245) 评论(0) 推荐(0)
摘要:哈哈 阅读全文
posted @ 2017-04-20 20:51 Mr.do 阅读(160) 评论(0) 推荐(0)
摘要:一、锁的语义 锁机制是Java中最重要的同步机制,其能够使临界区的代码互斥执行,且执行的结果对下一个拿到锁的线程立即可见。个人感觉,大家普遍对锁的互斥性有普遍的理解,很容易忽略了锁提供的可见性的保证。试想,如果锁仅仅提供了互斥,在临界区代码执行完之后,不把相应的执行结果刷回主内存,那么下一个线程拿到 阅读全文
posted @ 2017-04-19 21:52 Mr.do 阅读(182) 评论(0) 推荐(0)
摘要:一、volatile关键字的语义 当用volatile关键字修饰一个变量时,这个变量就会有一点特殊: 1. 可见性:volatile能够保证其所修饰变量的可见性,即一个线程对volatile变量的写,对后续的读是立即可见的 2. 原子性:volatile是无法保证对变量复合操作的原子性的(如vola 阅读全文
posted @ 2017-04-18 08:44 Mr.do 阅读(179) 评论(0) 推荐(0)
摘要:一、 as-if-serial语义 上篇文章中说道,编译器,运行时的JIT编译器或处理器都会对指令进行重排序以提升程序的执行性能。但这些重排序需要满足as-if-serial语义,不能随便的进行重排序。as-if-serial语义即指:不管怎么重排序,单线程程序的执行结果不能被改变。因此,不能对存在 阅读全文
posted @ 2017-04-17 23:19 Mr.do 阅读(339) 评论(0) 推荐(0)
摘要:一、并发中的关键问题及其解决思路 并发中的关键问题:1. 线程之间如何通信 —— 线程之间如何交换信息2. 线程之间如何同步 —— 控制线程的相对执行顺序 两种解决思路: 1. 隐式通信,显示同步 —— 线程之间通过共享内存中的公共状态来隐式通信,那么就必须显示的指定线程见的互斥来实现同步2. 显式 阅读全文
posted @ 2017-04-17 21:28 Mr.do 阅读(903) 评论(0) 推荐(0)
摘要:在团队的重试与延迟调度项目中,使用了基于DelayQueue的方式来实现时间调度和触发,此处,对DelayQueue进行一些梳理。 首先是Queue接口,关于队列的含义,不再赘述。如下,Queue接口方法,按抛异常或返回特定值(null)可以分为两类如下图: 接下来是BlockingQueue接口, 阅读全文
posted @ 2017-03-21 10:17 Mr.do 阅读(728) 评论(0) 推荐(0)
摘要:在项目中,常常会遇到这么一种场景,即对一批/一种/一堆数据,进行链式的处理。举个栗子,拿到一个task后,需要对这个task进行校验处理、状态变更处理、计算并回填数据处理等等各种处理,这种情况下,最适合的编码方式就是使用责任链了: 定义一个taskprocessor接口: 然后,再定义诸多的实现类, 阅读全文
posted @ 2017-03-16 16:59 Mr.do 阅读(609) 评论(0) 推荐(0)
摘要:首先说说与ThreadLocal相识的背景。在项目中,service有一些逻辑处理{如对主从延迟敏感的下单逻辑}需要强制走主库的。就查了查公司数据库框架zebra强制走主库的方式,发现其主要就是在业务线程的context中写入了一个ThreadLocal<Boolean>变量,当要进行SQL路由时, 阅读全文
posted @ 2017-03-05 16:43 Mr.do 阅读(354) 评论(0) 推荐(0)
摘要:在程序的开发过程中,可以使用debug打断点来调试程序,观察程序的运行情况。那代码上线之后,怎么看程序的运行情况呢?打log。 1、 程序log的几处应用: 定位问题 观察程序的运行状态 统计 定位问题 观察程序的运行状态 统计 log的三大组件: Logger:输入日志的具体内容 Appender 阅读全文
posted @ 2017-02-14 19:55 Mr.do 阅读(139) 评论(0) 推荐(0)
摘要:阻塞IO的server结构图: 阻塞IO的server版本代码: 在上面版本的代码中,有两个地方是阻塞的: 其一是ServerSocket.accept( )方法,该方法的语义是到连接请求队列中,取出一个建立连接,建立好后,返回这个链接的句柄(Socket)。当队列中无连接请求时,该方法就会一直阻塞 阅读全文
posted @ 2017-02-14 19:51 Mr.do 阅读(200) 评论(0) 推荐(0)
摘要:Executor框架的最大优点是把任务的提交和执行解耦,ExecutorService和其各种功能强大的实现类提供了非常简便方式来提交任务并获取任务执行结果,封装了任务执行的全部过程。而封装最大的效果是使得真正执行任务的线程们变得不为人知。使得操作友好,不用程序员关心具体的执行,只需要等结果就行了。 阅读全文
posted @ 2015-08-06 14:12 Mr.do 阅读(160) 评论(0) 推荐(0)
摘要:在HashMap的分析中,介绍了hashmap不是线程安全的,其在并发环境使用fail-fast策略来抛出由并发错误导致的异常。 先来看下Hashtable这个线程安全的容器,其虽然是线程安全的,但是其实现并发安全的手段比较粗暴。从下面的三个方法就能看出来,其只是简单的以自身作为对象锁,将相关方法都 阅读全文
posted @ 2015-07-16 14:41 Mr.do 阅读(165) 评论(0) 推荐(0)
摘要:先来说说代理模式(静态代理): 其为23种设计模式之一,属于结构型模式,其主要思想是通过一个代理对象来代替真实对象来响应client的调用或请求。静态代理要求代理类与真实类实现一个共同的接口,这样代理对象才能在“型”上代替真实对象。类图如下: 一个通过代理模式来代理并增强真实对象的简单示例: 代理模 阅读全文
posted @ 2015-07-15 20:34 Mr.do 阅读(191) 评论(0) 推荐(0)
摘要:HashMap的系统介绍: HashMap实现了Map接口(注意:map类容器都没有实现Collection接口,只有set,list这类的容器才实现Collection),其对一般的基本操作(put,get,contains)能够保证常数时间,当然前提是hash function能让各个key分布 阅读全文
posted @ 2015-07-12 20:51 Mr.do 阅读(124) 评论(0) 推荐(0)
摘要:所谓泛型,就是指编程语言中能够编写出更加“通用”、“泛化”的代码。希望能利用泛型,编写出一个能处理各种各样类型对象实例的处理过程代码。 首先,考虑下面一段通用代码: 在java se5之前,很多代码可能就是这样编写的,但java引入了泛型之后: 对比上面的两段代码,发现使用泛型时,java主要多做了 阅读全文
posted @ 2015-07-07 16:22 Mr.do 阅读(162) 评论(0) 推荐(0)
摘要:个人理解,可能有误。理解自《java编程思想》。 首先,什么是RTTI? RTTI(run-time type information)指的是Java在运行时能够获得或判断某个对象的类型信息。以Shape, Circle, Squre, Triangle为例,后三者继承shape。 主要有三种方式: 阅读全文
posted @ 2015-06-24 17:02 Mr.do 阅读(1404) 评论(0) 推荐(0)