摘要: 引子 什么是内部类?什么是内存泄露?为什么Android的内部类容易引起内存泄露?如何解决? 什么是内部类? 什么是内部类?什么又是外部类、匿名类、局部类、顶层类、嵌套类?大家可以参考我这篇文章 ,再查查一些资料,先弄清楚什么是内部类和内部类的特性再向下看。 经常会遇见Android程序中这样使用h 阅读全文
posted @ 2015-08-31 11:07 cacard 阅读(6611) 评论(0) 推荐(5) 编辑
摘要: 概览 * Message:消息。消息里面可包含简单数据、Object和Bundle,还可以包含一个Runnable(实际上可看做回调)。 * MessageQueue:消息队列,供Looper线程消费消息。 * Looper:用于循环处理Message,一个Thread结合一个Looper来实现消息 阅读全文
posted @ 2014-07-01 11:00 cacard 阅读(879) 评论(0) 推荐(0) 编辑
摘要: 疑问 * ArrayList是非线程非安全的,具体是指什么?具体会产生什么问题?* ArrayList的内部原理是什么?为什么可以动态扩容?* Vector是线程安全的,具体是如何实现的?为什么不再推荐使用?还有它的适用场景吗?* 迭代时集合发生了修改怎么办?什么是fail-fast? 线程安全和非 阅读全文
posted @ 2014-04-19 08:01 cacard 阅读(2536) 评论(0) 推荐(0) 编辑
摘要: JVM执行Java程序时需要装载各种数据,比如类型信息(Class)、类型实例(Instance)、常量数据(Constant)、本地变量等。不同的数据存放在不同的内存区中,这些数据内存区称作“运行时数据区(Runtime Data Area)”。运行时数据区有这样几个重要区:JVM Stack(简... 阅读全文
posted @ 2014-03-30 20:10 cacard 阅读(7011) 评论(0) 推荐(2) 编辑
摘要: 如何判断垃圾对象?垃圾收集的第一步就是先需要算法来标记哪些是垃圾,然后再对垃圾进行处理。引用计数(ReferenceCounting)算法这种方法比较简单直观,FlashPlayer/Python使用该算法,简单高效。核心思路是,给每个对象添加一个被引用计数器,被引用时+1,引用失效-1,等于0时就表示该对象没有被引用,可以被回收。但是,Java/C#并不采用该算法,因为该算法没有解决对象相互引用的问题,即:当两个对象相互引用且不被其它对象引用时,各自的引用计数为1,虽不为0,但仍然是可被回收的垃圾对象。根搜索(GC Roots Tracing)算法基本原理是:GCRoot对象作为起始点(根) 阅读全文
posted @ 2014-03-28 21:29 cacard 阅读(5792) 评论(1) 推荐(2) 编辑
摘要: 无锁编程 / lock-free / 非阻塞同步无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。实现非阻塞同步的方案称为“无锁编程算法”(Non-blocking al... 阅读全文
posted @ 2014-03-20 15:43 cacard 阅读(21619) 评论(1) 推荐(5) 编辑
摘要: 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 阅读(2553) 评论(0) 推荐(1) 编辑
摘要: MQTT -MQ Telemetry Transport轻量级的 machine-to-machine 通信协议。publish/subscribe模式。基于TCP/IP。支持QoS。适合于低带宽、不可靠连接、嵌入式设备、CPU内存资源紧张。是一种比较不错的Android消息推送方案。FacebookMessenger采用了MQTT。MQTT有可能成为物联网的重要协议。消息体MessageTypeCONNECTTCP连接建立完毕后,Client向Server发出一个Request。如果一段时间内接收不到Server的Response,则关闭socket,重新建立一个session连接。如果一个 阅读全文
posted @ 2014-03-15 10:20 cacard 阅读(102446) 评论(1) 推荐(2) 编辑
摘要: 工作队列:Working Queue工作队列这个概念与简单的发送/接收消息的区别就是:接收方接收到消息后,可能需要花费更长的时间来处理消息,这个过程就叫一个Work/Task。几个概念分配:多个接收端接收同一个Queue时,如何分配?消息确认:Server端如何确定接收方的Work已经对消息进行了完整的处理?消息持久化:发送方、服务端Queue如何对未处理的消息进行磁盘持久化?Round-robin分配多个接收端接收同一个Queue时,采用了Round-robin分配算法,即轮叫调度——依次分配给各个接收方。消息确认默认开启了消息确认(接收方接收到消息后,立即向服务器发回确认)。消息接收方处理 阅读全文
posted @ 2014-03-14 10:55 cacard 阅读(10498) 评论(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 阅读(8936) 评论(1) 推荐(0) 编辑