- 浏览: 476054 次
- 性别:
- 来自: 杭州
最新评论
-
基地分子:
zk中获取的netty怎么保证一定能用呢?如果某个netty服 ...
Zookeeper实现简单的分布式RPC框架 -
javaeyetodj:
你好,想请教下,前置通知、后置通知如何插入到目标方法的前面和后 ...
Spring aop的多种配置方式以及源码分析 -
yjy1304:
List<String> nodes = zk.g ...
ZK实现分布式排它锁 -
model1235:
都spring4了,还在介绍这么古老的方法
Spring 事务处理(二)源码分析 -
zhangwei_david:
lopez 写道楼主直接new一个接口(new Resourc ...
java多线程lock详解
文章列表
目录
FutureTask
ExecutorCompletionService
AbstractExecutorService
ThreadPoolExecutor
FutureTask
FutureTask类 结构
FutureTask实现了RunnableFuture接口,而RunnableFuture继承了Runnable和Future,也就是说FutureTask既是Runnable,也是Future。
ReentrantReadWriteLock中的state代表了读锁的数量和写锁的持有与否,整个结构如下:
在本文中对AQS部分源码不在讲解,可以参考 AbstractQueuedSynchronizer源码分析
首先从读锁开始看起
readLock.lock()
/**
* 获 ...
目录
AQS结构
Node结构
AQS阻塞链表
ReentrantLock
ReentrantLock FairSync
ReentrantLock NonfairSync
Condition
CountDownLatch
为了搞清楚AQS到底是有什么特性需要先看看AQS有哪些属性
数据类型:
class 文件结构
minor version:副版本
major version:主版本号
文件的版本号 major_version.minor_version
flags:访问标志
ACC_PUBLICH 声明为publich
ACC_FINAL 声明为final
ACC_SUPER 当用到invokespecial指令时,需要对父类方法做特殊处理
ACC_INTERFACE 该class文件定义的是接口而不是类
ACC_ABSTRACT 声明为abstract
ACC_SYNTHETIC 声明为synthetic
...
ConcurrentHashMap在Java8中的实现改动较大,网上关于ConcurrentHashMap的文章也很少有基于java8的,将个人的一些理解记录下来以供分享。
Node
ConcurrentHashMap底层是通过数组+链表(树)来实现的,数组中存储的就是Node。它与HashMap中的定义很相似,但是有一些差别它对value和next属性设置了volatile同步锁,它不允许调用setValue方法直接改变Node的value域,它增加了find方法辅助map.get()方法。
transient volatile Node<K,V>[] table;
...
这个demo演示了NIO在客户端并发访问多个站点的示例:
同时访问了 www.kaola.com,www.jd.com,www.tmall.com,www.suning.com这个四个站点的首页,通过打印的信息可以发现总耗时取决于最大suning的耗时。
ue May 09 23:41:07 CST 2017[1494344467724],main,end...
Tue May 09 23:41:07 CST 2017[1494344467724],main,connecting to www.kaola.com
Tue May 09 23:41:07 CST 2 ...
在JAVA7之前,并行处理数据非常麻烦。第一,你得明确把包含数据的数据结构分成若干份。第二,你要将每个子部分分配给一个独立的线程。第三,你要在恰当的时候对它们进行同步避免不希望的竞争条件,等待所有线程完成,最后把这些部分结果合并起来。在Java 7引入了分支/合并框架,让这些操作更稳定、更不容易出错。
分支/合并框架的目的是以递归的方式将可以并行的任务拆分为更小的任务,然后将每个子任务的结果合并起来生成整体结果。要把子任务提交到ForkJoinPool必须创建RecursiveTask<R>的子类。需要实现它唯一的抽象方法 protected ab ...
lamda 是Java8中增加的一个新特性。lamda表达式语法很简单,使用-> 将参数列表和表达式体分割开来。
(Type1 param1, Type2 param2, ..., TypeN paramN) -> { //do somthing}
(int x,int y)-> x+y 等价于 (int x,int y)->{x+y;}
如果有一个列表[1,2,3,4,5,6] 需要遍历并打印出来,如果不是用lamda表达式实现方式如下:
List<Integer> l ...
IOC 是Spring的核心,我们以编程方式使用DefaultListableBeanFactory,尽管在现实的编码过程中几乎不会这种原始的方式,但是作为了解Spring IOC 实现还是很有必要的。
//创建IOC配置的抽象资源
ClassPathResource resource=new ClassPathResource("client.xml");
//创建一个BeanFactory
DefaultListableBeanFactory beanFactory=new DefaultListableBeanFacto ...
AbstractHandlerMethodMapping类实现了InitializingBean接口,在属性初始化完成后会调用afterPropertiesSet()方法,在该方法中调用initHandlerMethods();进行HandlerMethod初始化。
/**
* 扫描ApplicationContext中的Bean,查找并注册 handlerMethod
*/
protected void initHandlerMethods() {
if (logger.isDebugEnabled()) {
logger.debug(&qu ...
Netty通过心跳保持长链接
- 博客分类:
- Java
Netty自带心跳检测功能,IdleStateHandler,客户端在写空闲时主动发起心跳请求,服务器接受到心跳请求后给出一个心跳响应。当客户端在一定时间范围内不能够给出响应则断开链接。
public class NettyClient {
public void connect(String remoteServer, int port) throws Exception {
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
Bootstrap b = new Bootstrap ...
Spring事物的配置样式如下:
<bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
abstract="true">
<property name="transactionManager" ref="transactionManager"/>
< ...
Lock是JDK1.5种新增的同步工具,其实真正的实现Lock接口的类就三个,ReentrantLock和ReentrantReadWriteLock的两个内部类(ReadLock和WriteLock实现了Lock的接口);
ReentrantLock 实现了标准的互斥操作,也就是一次只能有一个线程持有锁,也即所谓独占锁的概念。我们也一直在强调这个特点。显然这个特点在一定程度上面减低了吞吐量,实际上独占锁是一种保守的锁策略,在这种情况下任何“读/读”,“写/
Java面试题之 static执行顺序
- 博客分类:
- Java
下面代码执行后最终的结果是:
public class StaticDemoSupper {
static {
System.out.println("A");
}
/**
*
*/
public StaticDemoSupper() {
System.out.println("B");
}
}
public class StaticDemoChild extends StaticDemoSupper {
static{
System.out.println(&q ...
Java面试题之 String
- 博客分类:
- Java
有这样一个面试题:
String a = "a";
String a1 = new String("a");
String a2 = a1.trim() + "";
String a3 = "a" + "";
String a4 = "a".trim() + "";
System.out.println(a == a1);
System.out.println(a.intern() == ...