软件的模块越来越插件化发展了,连硬件都处处热插拔,软件更当如此。记原来有个 JPF(Java Plugin Framework),也能实现动态插件化,但要是有个业界标准的东西一般来说会更好的。于是轮到 OSGI(Open Service Gateway Initiative) 登台,OSGI 出来也有好几个年头了,应用也轰轰烈烈的,比如 Eclipse 3 开始不再使用原来的插件体系,完全用 OSGI 搭建。WebSphere 6.1 也全面改用 OSGI;JBoss、WebLogic、Spring DM,甚至是 BMW 车的控制系统中都得到了很好的应用。
前面讲到可以用 OSGI 作为你的微内核,微内核的好处可以打个这样的比方:一台 Linux 服务器出故障了,应用程序坏了、某些服务不能访问等,但只要它还来连入网络,SSH 还是活的,我们就有办法进去修复它,想安装、卸载什么都行。 Read More
- 使用 Eclipse 的 OSGI 实现 Equinox,通过 config.ini 配置文件在命令行时启动 Equinox 时,可以进到 osgi> 是提示符,但是除 org.eclipse.osgi_3.5.2.R35x_v20100126 是 STARTING 外,其他的 Bundle 都是 RESOLVED 状态,没法进入到 ACTIVE 状态,osgi> start xxx 也不行。
然后看目录 configuration 目录中生成的日志文件,是如下错误:
!SESSION 2010-03-30 11:40:40.156 -----------------------------------------------
eclipse.buildId=unknown
java.version=1.6.0_18
java.vendor=Sun Microsystems Inc.
BootLoader constants: OS=win32, ARCH=x86_64, WS=win32, NL=zh_CN
Command-line arguments: -console Read More - 熟悉 Java 的多线程的一般都知道会有数据不一致的情况发生,比如两个线程在操作同一个类变量时,而保护数据不至于错乱的办法就是让方法同步或者代码块同步。同步时非原子操作就得同步,比如一个简单的 1.2+1 运算也该同步,以保证一个代码块或方法成为一个原子操作。
简单点说就是给在多线程环境中可能会造成数据破坏的方法,做法有两种,以及一些疑问:
1. 不论是静态的或非静态的方法都加上 synchronized 关键字,那静态的方法和非静态的方法前加上 synchronized 关键字有区别吗?
2. 或者在可疑的代码块两旁用 synchronized(this) 或 synchronized(someObject) 包裹起来,而选用 this 还是某一个对象--someObject,又有什么不同呢?
Read More - 一看到 Java NIO 的内存映射文件(MappedByteBuffer),让我立即就联想到 Windows 系统的内存映射文件。Windows 系统的内存映射文件能用来在多个进程间共享数据,即进程间的共享内存,是通过把同一块内存区域映射到不同进程的地址空间中,从而达到共享内存。
Java NIO 的内存映射文件和 Windows 系统下的一样,都能把物理文件的内容映射到内存中,那么 MappedByteBuffer 是否能用来在不同 Java 进程(JVM) 间共享数据呢?答案是肯定的,这样在通常的 Socket 方式来实现 Java 进程间通信之上又多了一种方法。 Read More - 1、共享内存对应应用开发的意义
对熟知UNIX系统应用开发的程序员来说,IPC(InterProcess Communication)机制是非常熟悉的,IPC基本包括共享内存、信号灯操作、消息队列、信号处理等部分,是开发应用中非常重要的必不可少的工具。其中共享内存IPC机制的关键,对于数据共享、系统快速查询、动态配置、减少资源耗费等均有独到的优点。
对应UNIX系统来说,共享内存分为一般共享内存和映像文件共享内存两种,而对应Windows,实际上只有映像文件共享内存一种。所以Java应用中,也是只能创建映像文件共享内存。 Read More - 我们用原有 IO 读写文件应该不会陌生了,顺带回顾一下,大致两种:
1. 在 InputStream 或 OutputStream 上读写字节或字节数组,读 InputStream 时用是否返回 -1 来判断是否到达末尾。
2. 包装成 Reader/Writer 可以直接读写字符串,进一步包装到 BufferedReader/BufferedWriter 就可以按行读写了。readLine() 时看是否返回 null 断定是否读完了最后一行。
现在我们要用 NIO 来读写文件,肯定是要用到 Channel 和 Buffer 了。一句话描述过程就是从 FileInputStream 得到的 FileChannel 中读取数据到 Buffer 中,再处理 Buffer 中的数据。看代码: Read More 对于 NIO 来说,Channel(通道) 和 Buffer(缓冲区) 这两个东西是不得不提的,因为它们是 NIO 的核心对象,几乎每一个 I/O 操作都要它们。
通道是对原 I/O 流的模拟,但有不同的是它是双向的,不再像流那样分 InputStream 和 OutputStream,通道的双向性更好的反映了底层操作系统的真识情况。也不能像原 I/O 那样可以直接往流里写或读数据,在通道了传输数据必须经由缓冲区。有点类似原 I/O 流通过过滤器流 BufferedInputStream 和 BufferedOutputStream 来读写数据。
FileInputStream/FileOutputStream/RandomAccessFile/DatagramSocket/ServerSocket/Socket 的 getChannel() 方法可以获得相应类型的 Channel,Channel 的类型有 FileChannel/SocketChannel/SelectableChannel/DatagramChannel/ServerSocketChannel 等。 Read More
Java NIO(New IO) 还是在 JDK 1.4 中引入的新特性。JDK 1.4 的另一重要特性正则表达式大家应该经常用到,但 NIO 就可能使用寥寥了,大概是缘于旧有 IO 体系仍然够用。有如 JDK1.5 早就泛型和注解了,但基于各种原因而无法亲力去实践泛型和注解一般,NIO 多数时候也只是与我们擦着肩而已。
相比与 Old IO,NIO 在某些领域里确有其过人之处,所以现在让我们一起来对 NIO 有个更楚的认识。
NIO 的相关 API,在 java.nio 中,它会与你纠缠的就是各种 Channel 和 Buffer。相关的应用在于处理通道和缓冲区、异步(非阻塞)的 IO、文件的锁定、字符集的处理上。 Read More
- 了解了下 Scala(http://www.scala-lang.org) 语言的特性,也觉得颇有些搞头。 首先不失面象对象的特征,又能作泛函编程,并能像 Erlang 那样适用于多核、并发编程。 且看看这个语言的名称 Scalable,即可知它的志向之远大。力求以高定制、扩展性去应用于,无论是小软件还是大应用。
Groovy 之父说过:要是早知有 Scala,就不会再发明 Groovy。这两东西都是构筑在 JVM 平台的,要说 Groovy 发展至念今,所得奖项也不少,推广好像不咋样。 以及有“Scala 将成为现代 Web 2.0 的发起语言” 的论调,还有 Scala 实际在 Twitter 上的应用等等。
然而,国内好像对 Scala 的了解还不多,于是滋生了一个在国内对它进行推广的念头:建个站点、弄个域名、紧跟 Scala 的脚步,网友热心参与。 就像人名一样,域名也应该是要让人印像深刻的。前几天在万网上搜索时像 scalachina.com、scalacn.com、cnscala 等都没人用,可是工作忙了下, 耽搁了几天,那几个域名就被人占了去,并且也能看到人家的页面了。
没奈,时间上咱是差了一步,那我还是有信息在其他方面做得更好的啊。再说呢,也没过几个 什么什么中国 的网站做得特别出色的呀, 看看 JavaEye 是怎么后来崛起的就知道了。我的目标是想做出一个像 JavaEye 那样的东西,看过有个叫 PhpEye,如果再叫 ScalaEye 就有些老土了, 原本想的 Scala 中国 这样的名称就有些俗的。
Read More - 初看 cgaolei 翻译的 Java技巧之双括弧初始化 一文,走马观花,只知用法,未细看后面的解释。蔚为惊艳,心里想 Java 竟然有这么神奇的语法而一直未得知。因为在初始化集合时确实方便不少。原来做某些测试要初始化集合时会用到 commons-lang 包和 JDK 的 Arrays 工具类,现在知道可以这么用了:
1Map map = new HashMap() {{ 2 put("Name", "Unmi"); 3 put("QQ", "1125535"); 4}}; 5 6List stooges = new ArrayList() {{ 7 add("Larry"); 8 add("Moe"); 9 add("Curly"); 10}};
看起来都是在一条语句里完成,而不需要分步骤写成: Read More