随笔分类 -  10@Java

摘要:疑问 * ArrayList是非线程非安全的,具体是指什么?具体会产生什么问题?* ArrayList的内部原理是什么?为什么可以动态扩容?* Vector是线程安全的,具体是如何实现的?为什么不再推荐使用?还有它的适用场景吗?* 迭代时集合发生了修改怎么办?什么是fail-fast? 线程安全和非 阅读全文
posted @ 2014-04-19 08:01 cacard 阅读(2540) 评论(0) 推荐(0) 编辑
摘要:JVM执行Java程序时需要装载各种数据,比如类型信息(Class)、类型实例(Instance)、常量数据(Constant)、本地变量等。不同的数据存放在不同的内存区中,这些数据内存区称作“运行时数据区(Runtime Data Area)”。运行时数据区有这样几个重要区:JVM Stack(简... 阅读全文
posted @ 2014-03-30 20:10 cacard 阅读(7020) 评论(0) 推荐(2) 编辑
摘要:如何判断垃圾对象?垃圾收集的第一步就是先需要算法来标记哪些是垃圾,然后再对垃圾进行处理。引用计数(ReferenceCounting)算法这种方法比较简单直观,FlashPlayer/Python使用该算法,简单高效。核心思路是,给每个对象添加一个被引用计数器,被引用时+1,引用失效-1,等于0时就表示该对象没有被引用,可以被回收。但是,Java/C#并不采用该算法,因为该算法没有解决对象相互引用的问题,即:当两个对象相互引用且不被其它对象引用时,各自的引用计数为1,虽不为0,但仍然是可被回收的垃圾对象。根搜索(GC Roots Tracing)算法基本原理是:GCRoot对象作为起始点(根) 阅读全文
posted @ 2014-03-28 21:29 cacard 阅读(5794) 评论(1) 推荐(2) 编辑
摘要:JDK5引入了JMM新规范:JSR-133,引入了happens-before/可见性等概念,对synchronized/volatile/final等关键词进行了语义定义。解决了:final变量在构造器中初始化的线程安全问题以及volatile变量与no-volatile变量之间的重排序问题。为什么需要Memory Model在多线程的场景下,thread1修改了一个变量后,thread2要读取这个变量,其间可能会发生指令执行顺序的问题(因为编译器优化指令、处理器重排指令、写数据缓存未及时更新到主内存)。如何保证thread2要读的变量是想要的thread1修改后的变量呢?Memory Mo 阅读全文
posted @ 2014-03-18 09:52 cacard 阅读(2554) 评论(0) 推荐(1) 编辑
摘要:工作队列:Working Queue工作队列这个概念与简单的发送/接收消息的区别就是:接收方接收到消息后,可能需要花费更长的时间来处理消息,这个过程就叫一个Work/Task。几个概念分配:多个接收端接收同一个Queue时,如何分配?消息确认:Server端如何确定接收方的Work已经对消息进行了完整的处理?消息持久化:发送方、服务端Queue如何对未处理的消息进行磁盘持久化?Round-robin分配多个接收端接收同一个Queue时,采用了Round-robin分配算法,即轮叫调度——依次分配给各个接收方。消息确认默认开启了消息确认(接收方接收到消息后,立即向服务器发回确认)。消息接收方处理 阅读全文
posted @ 2014-03-14 10:55 cacard 阅读(10500) 评论(0) 推荐(1) 编辑
摘要:简介RabbitMQ是一个Message Broker,核心思想就是接受消息,转发消息。实现的协议:AMQP。术语(Jargon)P,Producing,制造和发送信息的一方。Queue,消息队列。C,Consuming,接收消息的一方。Simple Demo发送方 ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = conn.. 阅读全文
posted @ 2014-03-13 20:09 cacard 阅读(8937) 评论(1) 推荐(0) 编辑
摘要:特点* 各个元素不仅仅按照HashMap的结构存储,而且每个元素包含了before/after指针,通过一个头元素header,形成一个双向循环链表。使用循环链表,保存了元素插入的顺序。* 可设置参数,让每次get()后的元素排在双向链表的最后。Entry类private static class ... 阅读全文
posted @ 2014-03-08 21:55 cacard 阅读(893) 评论(0) 推荐(0) 编辑
摘要:特性* 允许null作为key/value。* 不保证按照插入的顺序输出。使用hash构造的映射一般来讲是无序的。* 非线程安全。* 内部原理与Hashtable类似。源码简要分析public class HashMap{ static final int DEFAULT_INITIAL_C... 阅读全文
posted @ 2014-03-07 21:54 cacard 阅读(416) 评论(0) 推荐(0) 编辑
摘要:Hashtable /HashMap / LinkedHashMap 概述* Hashtable比较早,是线程安全的哈希映射表。内部采用Entry[]数组,每个Entry均可作为链表的头,用来解决冲突(碰撞)。* HashMap与Hashtable基本原理一样,只是HashMap允许null的key... 阅读全文
posted @ 2014-03-06 21:52 cacard 阅读(2996) 评论(0) 推荐(0) 编辑
摘要:为什么需要线程池?每次都要new一个thread,开销大,性能差;不能统一管理;功能少(没有定时执行、中断等)。使用线程池的好处是,可重用,可管理。Executor4种线程池// 可缓存线程池,如果缓存中没有可用的,则移出60秒未使用过的线程ExecutorService service=Executors.newCachedThreadPool();// 大小固定的线程池ExecutorServiceservice= Executors.newFixedThreadPool(5);// 单线程,是线程量=1的FixedThreadPool,多任务下相当于排队。ExecutorServices 阅读全文
posted @ 2013-07-01 11:42 cacard 阅读(593) 评论(0) 推荐(0) 编辑
摘要:C#下面的Delegate可以让方法传递方法,在Java下却没有类似的机制。如何在Java下面模拟出Delegate呢?使用反射试试。贴代码:/** author:licunqing */import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class Delegate { private Class c=null; private String method=null; private Class[] paramsType=null; priv... 阅读全文
posted @ 2013-02-28 09:38 cacard 阅读(5646) 评论(0) 推荐(1) 编辑
摘要:ChannelChannel用来操作数据块,写入buffer或者从IO中读到buffer。SocketChannel创建// 创建,并阻塞等待连接SocketChannel sc = SocketChannel.open(new InetSocketAddress("abc.com",80));// 创建,使用connect()连接SocketChannel sc = SocketChannel.open();sc.connect(new InetSocketAddress("abc.com",80)); // blocking// 创建,非阻塞Sock 阅读全文
posted @ 2012-03-06 20:44 cacard 阅读(1786) 评论(0) 推荐(0) 编辑
摘要:本笔记包含:Socket:Socket for ClientServerSocket:Socket for Server一些Demo什么是Socket?IP+端口无法实现底层的网络嗅探以及获得IP包结构等信息Socket程序思路Server端口Listen(监听)某个端口是否有连接请求;Client向Server发出Connect请求,写数据,立即返回;网络发送中...Server向Client发出Accept;连接建立;Server/Client通过Send/Write等方法通信。关于端口1 client 向 server 发送时,指定了远程端口(比如90),也生成了一个随机的本地端口(比如 阅读全文
posted @ 2012-03-06 13:45 cacard 阅读(3126) 评论(0) 推荐(0) 编辑