摘要: 先保证并发的正确性,然后在此基础上来实现高效。线程安全: 当多个线程访问一个对象时,如果不考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象就是线程安全的。——Brian Goetz 线程安全是限定于多个线程之间存在共享数据访问这个前提下的。 线程安全由强至弱的“安全程度”:不可变、绝对线程安全、相对线程安全、线程兼容和线程对立。 不可变:不可变的对象一定是线程安全的,只要一个不可变的对象被正确的构建出来,那其外部的可见状态永远也不会改变,永远也不会看到它在多个线程之中处于不一致的状... 阅读全文
posted @ 2013-07-25 09:48 赵国勇 阅读(350) 评论(0) 推荐(0) 编辑
摘要: 主要内容:虚拟机如何实现多线程、多线程之间由于共享和竞争数据而导致的一系列问题及解决方案。Java内存模型: Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。(这里所说的变量是指可能存在竞争问题的实例字段、静态字段和构成数据对象的元素) Java内存模型规定了所有的变量都存储在虚拟机内存的主内存(Main Memory)中,每条线程还有自己的工作内存(Working Memory),线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必须在自己的工作内存中进行,而不能直接读写主内存中的变量。  阅读全文
posted @ 2013-07-24 10:27 赵国勇 阅读(520) 评论(0) 推荐(0) 编辑
摘要: 主要学习并记录在命令行中操作服务器时使用的六大命令工具,可视化工具JConsole和VisualVM在开发过程中熟悉。一、jps:虚拟机进程状况工具(JVM Process Status Tool) 列出正在运行的虚拟机进程,并显示虚拟机执行主类的名称和这些进程的本地虚拟机唯一ID(LVMID)。 快速定位到某个虚拟机进程。 jps命令格式: jps [options] [hostid] Options: -q只输出LVMID,省略主类的名称; -m 输出虚拟机进程启动时传递给主类Main()函数的参数; -l 输出主类的全名,如果进程执行的是jar包,输出jar路径; ... 阅读全文
posted @ 2013-07-22 13:46 赵国勇 阅读(373) 评论(0) 推荐(0) 编辑
摘要: 1960年诞生于MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言。Java的垃圾收集(GarbageCollection)主要关注堆和方法区的内存回收。在GC堆进行回收前,第一件事情就是要确定哪些对象还活着,哪些对象已经死亡,需要被回收。判断对象是否存活的算法: 1)引用计数器(ReferenceCounting)【Java的GC不使用此算法】: 给对象添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值减1,计数器为0的对象就是不可能再被使用的。 使用者:微软COM技术、使用ActionScript3的FlashPlayer、Python、... 阅读全文
posted @ 2013-07-03 09:59 赵国勇 阅读(330) 评论(0) 推荐(0) 编辑
摘要: Java程序员把内存的控制权交给了Java虚拟机。在Java虚拟机内存管理机制的帮助下,程序员不再需要为每一个new操作写对应的delete/free代码,而且不容易出现内存泄露和溢出。虚拟机在执行Java程序过程中,会把它所管理的内存划分为若干个不同的数据区域,各个区域有各自的用途,以及创建和销毁时间。《Java虚拟机规范(第二版)》规定了Java虚拟机所管理的内存将包括以下几个运行时数据区域: 线程共享级别:方法区(MethodArea)、堆(Heap) 线程私有级别:虚拟机栈(VMStack)、本地方法栈(NativeMethodStack)、程序计数器(ProgramCounter.. 阅读全文
posted @ 2013-07-01 16:04 赵国勇 阅读(403) 评论(0) 推荐(0) 编辑
摘要: 上文《Netty框架入门》说到:如果业务处理handler耗时长,将严重影响可支持的并发数。针对这一问题,经过学习,发现了可以使用ExecutionHandler来优化。先来回顾一下没有使用ExecutionHandler优化的流程: 1)Boss线程(接收到客户端连接)->生成Channel->交给Worker线程池处理。 2)某个被分配到任务的Worker线程->读完已接收的数据到ChannelBuffer->触发ChannelPipeline中的ChannelHandler链来处理业务逻辑。 注意:执行ChannelHandler链的整个过程是同步的,如果业务逻辑 阅读全文
posted @ 2013-06-20 09:20 赵国勇 阅读(11188) 评论(1) 推荐(0) 编辑
摘要: 一、概述 Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。二、体系结构图 三、Netty的核心结构Netty是典型的Reactor模型结构,在实现上,Netty中的Boss类充当mainReactor,NioWorker类充当subReactor(默认NioWorker的个数是当前服务器的可用核数)。在处理新来的请求时,NioWorker读完已收到的数据到ChannelBuffer中,之后触发ChannelPipeline中的ChannelHandler流。Netty是事件驱动的. 阅读全文
posted @ 2013-06-19 17:48 赵国勇 阅读(68263) 评论(2) 推荐(2) 编辑
摘要: 地址:http://ued.taobao.com/quiz2/ 朋友分享了这个闯关,感觉挺好玩的,通关后记录一下,把解法分享出来,如果你想试试,请先不要看。如果你有更好玩的解法,欢迎交流。以下解法在Chrome浏览器下尝试,暂不考虑其他浏览器的兼容性。第一关:不解释。第二关:调样式,那个E是反转,不是旋转,这个一开始没看清,需要注意下的。U: top:26px;left:423px;E: top:26px;left:490px;-webkit-transform:scaleX(-1);D: top:26px;left:559px;第三关:这个要看一下页面源代码,有个class="we 阅读全文
posted @ 2013-02-06 16:15 赵国勇 阅读(911) 评论(0) 推荐(1) 编辑
摘要: 想在Ubuntu上装一个PPS看视频,但是需要先安装“MPlayer视频解码器”,中途在终端出现个“正在设定XXX”的界面,这个界面是个license,然后最下面有个”确定“(类似按钮),但是鼠标点击无效(坑爹啊)。 最后如下解决:读完license(拖到最下面),用键盘Tab键替换鼠标选中”确定“,按Enter键。 结论:Ununtu下要习惯多用键盘,尤其是在终端中,键盘才是王道。 阅读全文
posted @ 2012-07-27 00:05 赵国勇 阅读(421) 评论(0) 推荐(0) 编辑
摘要: 本文主内容:1、 Android NDK 安装2、 安装Cygwin与使用NDK编译3、 在Eclipse中集成C/C++开发环境CDT4、 安装Sequoyah插件5、 JNI编译环境配置本文建立在已经完成Android开发环境搭建的基础上。其基础环境至少需要包含以下内容:1、 JDK2、 Eclipse3、 Android SDK and ADT可以参考我之前的“Android开发环境搭建”。一、Android NDK 安装与配置下载Android NDK。下载地址:http://developer.android.com/tools/sdk/ndk/index.html下载后解压缩到你的 阅读全文
posted @ 2012-07-10 19:54 赵国勇 阅读(44964) 评论(11) 推荐(10) 编辑