Java 线程同步,对象锁与互斥规则

在前面一篇 是同步方法还是 synchronized 代码?-- 详解多线程同步规则 其实已清楚讲述了这里想要是解的话题,只是之前的长篇大论,没个重点,读来实在会让人受累,故在此单列一专题,假以图示,也为自己加深对同步锁的理解。道中人觉得哪里说得有出入或有更妙的理解方式,尽管拍过来。

记得我初识多线程时,就是很简单化的去理解了同步:说到要同步,无外乎就是给方法加 synchronized 关键字,或者给代码块加上 synchronized(this) 括起来[注:jdk 1.5 后可用 Lock 来同步代码],以为这样就万事大吉,就能保证一个线程执行时,另一个线程就进不来。其实不尽然,因为静态同步方法与非静态同步方法是有区别的,而 synchronized(this) 括号中是用 this 还是要用别的对象,也是有讲究的,这些问题可以阅读前一篇:是同步方法还是 synchronized 代码?-- 详解多线程同步规则阅读全文 >>

类别: Java/JEE. 标签: , , . 阅读(2,084). 评论(0) »

SLF4J 的几种实际应用模式--之三:JCL-Over-SLF4J+SLF4J

我们前面已经讲过了 SLF4J 的两种用法:SLF4J+Log4J  和 SLF4J+Logback,那是在比较理想的情况下,所用组件只使用了 SLF4J 这一种统一日志框架的时候。可是 JCL 一直影响深远,SLF4J 渐入佳境的时个,在你的项目中很可能所用的组件,它们分别用了 JCL 和 SLF4J 两种组件。比如说在项目中用了 Hibernate 3.5 和 Struts,或其他 Apache 的一些开源组件,你大约也不想用了 SLF4J 的组件日志信息输出到 A 处,用了 JCL 的组件日志输出到 B 处,那你自己写的代码中的日志信息该往哪儿写呢?

中国人一直都愿追求大一统,不喜欢城邦制的便于分而治之。但说到日志输出还是得统一到单一通道中来,一方面多个通道浪费资源,另方面也便于配置和管理。那么既然 SLF4J 是趋势,当 SLF4J 和 JCL 被丢到一个坛子里,首先会让 SLF4J 为主,JCL 为辅,也就是要把 JCL 桥接到 SLF4J 上来,通过 SLF4J 统一输出日志信息。于是也就是这篇要介绍的 SLF4J 使用模式:JCL-Over-SLF4J+SLF4J。 阅读全文 >>

类别: Java/JEE. 标签: , , , . 阅读(5,439). 评论(0) »

是同步方法还是 synchronized 代码?– 详解多线程同步规则

熟悉 Java 的多线程的一般都知道会有数据不一致的情况发生,比如两个线程在操作同一个类变量时,而保护数据不至于错乱的办法就是让方法同步或者代码块同步。同步时非原子操作就得同步,比如一个简单的 1.2+1 运算也该同步,以保证一个代码块或方法成为一个原子操作。

简单点说就是给在多线程环境中可能会造成数据破坏的方法,做法有两种,以及一些疑问:

1. 不论是静态的或非静态的方法都加上 synchronized 关键字,那静态的方法和非静态的方法前加上 synchronized 关键字有区别吗?

2. 或者在可疑的代码块两旁用 synchronized(this) 或 synchronized(someObject) 包裹起来,而选用 this 还是某一个对象--someObject,又有什么不同呢? 阅读全文 >>

类别: Java/JEE. 标签: , , . 阅读(959). 评论(8) »

Java NIO 应用 -- 使用内存映射文件实现进程间通信

一看到 Java NIO 的内存映射文件(MappedByteBuffer),让我立即就联想到 Windows 系统的内存映射文件。Windows 系统的内存映射文件能用来在多个进程间共享数据,即进程间的共享内存,是通过把同一块内存区域映射到不同进程的地址空间中,从而达到共享内存。

Java NIO 的内存映射文件和 Windows 系统下的一样,都能把物理文件的内容映射到内存中,那么 MappedByteBuffer 是否能用来在不同 Java 进程(JVM) 间共享数据呢?答案是肯定的,这样在通常的 Socket 方式来实现 Java 进程间通信之上又多了一种方法。 阅读全文 >>

类别: Java/JEE. 标签: , , . 阅读(5,814). 评论(5) »

共享内存在Java中实现和应用[转]

1、共享内存对应应用开发的意义

对熟知UNIX系统应用开发的程序员来说,IPC(InterProcess Communication)机制是非常熟悉的,IPC基本包括共享内存、信号灯操作、消息队列、信号处理等部分,是开发应用中非常重要的必不可少的工具。其中共享内存IPC机制的关键,对于数据共享、系统快速查询、动态配置、减少资源耗费等均有独到的优点。

对应UNIX系统来说,共享内存分为一般共享内存和映像文件共享内存两种,而对应Windows,实际上只有映像文件共享内存一种。所以Java应用中,也是只能创建映像文件共享内存。 阅读全文 >>

类别: Java/JEE. 标签: , . 阅读(430). 评论(0) »

Java NIO 入门学习(读写文件)

我们用原有 IO 读写文件应该不会陌生了,顺带回顾一下,大致两种:

1. 在 InputStream 或 OutputStream 上读写字节或字节数组,读 InputStream 时用是否返回 -1 来判断是否到达末尾。
2. 包装成 Reader/Writer 可以直接读写字符串,进一步包装到 BufferedReader/BufferedWriter 就可以按行读写了。readLine() 时看是否返回 null 断定是否读完了最后一行。

现在我们要用 NIO 来读写文件,肯定是要用到 Channel 和 Buffer 了。一句话描述过程就是从 FileInputStream 得到的 FileChannel 中读取数据到 Buffer 中,再处理 Buffer 中的数据。看代码: 阅读全文 >>

类别: Java/JEE. 标签: , . 阅读(1,148). 评论(0) »

Java NIO 入门学习(通道和缓冲区)

对于 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 等。 阅读全文 >>

类别: Java/JEE. 标签: , , , . 阅读(428). 评论(0) »

Java NIO 入门学习(过门)

Java NIO(New IO) 还是在 JDK 1.4 中引入的新特性。JDK 1.4 的另一重要特性正则表达式大家应该经常用到,但 NIO 就可能使用寥寥了,大概是缘于旧有 IO 体系仍然够用。有如 JDK1.5 早就泛型和注解了,但基于各种原因而无法亲力去实践泛型和注解一般,NIO 多数时候也只是与我们擦着肩而已。

相比与 Old IO,NIO 在某些领域里确有其过人之处,所以现在让我们一起来对 NIO 有个更楚的认识。

NIO 的相关 API,在 java.nio 中,它会与你纠缠的就是各种 ChannelBuffer。相关的应用在于处理通道和缓冲区、异步(非阻塞)的 IO、文件的锁定、字符集的处理上。 阅读全文 >>

类别: Java/JEE. 标签: , , . 阅读(162). 评论(0) »

本想做个 Scala 的推广,无奈本可注册的域名失了时机,望大家能出谋划策

了解了下 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 中国 这样的名称就有些俗的。

虽说那么多,搞个站点,空间是已经有了,但在最前面掌管门面的终究还是域名,在想一个响亮的名字。就像脑白金,为啥不以它的实际药品学名美乐通宁(melatonin) 来命名,而冠之以“脑白金”,方能显示其金贵。当然脑白金是太多的忽悠成分,我还是不用学这些。既然常规思维被阻断了,那只能另辟溪径,不走寻常路了。

望路过者也来想想假如是做个以 Scala 为内容的网站,集思广议,该取个什么网站名称或域名比较有寓意呢,响亮而容易给人留下深刻印象的。当然不是像恒源祥的广告那样,让人抓狂了被迫记住的效果。若是有兴趣的还可以一起来合作,即使进来调侃调侃下也会是不错的。

介绍一下现阶段比较好的 Scala 中文的网站:51CTO.com 下的 Scala 专题:http://developer.51cto.com/art/200906/127830.htm

类别: Java/JEE. 标签: , , . 阅读(206). 评论(7) »

iBatis 使用 OSCache 作缓存与 java.io.FileNotFoundException 异常

这种异常只会发生在 Windows 平台上,可以说是 iBatis 的一个 Bug,大约 iBatis 的开发测试人员都比较热衷于 Unix 族系的平台,而忽略了 Windows 下的兼容性测试。

出现 FileNotFoundException 异常的情形是这样的:Windows7 + iBatis2.3.0.677 + OSCache2.4.1。

iBatis 中配置使用 OSCache 缓存,在映射文件 Product.xml 中有如下声明片断:

OSCache 的 oscache.properties 中指明用磁盘文件缓存数据,注意以下几个配置: 阅读全文 >>

类别: iBatis. 标签: , , . 阅读(516). 评论(1) »