很小的一段多线程代码,如下:package untitled7;import java.io.*;
import java.nio.channels.*;public class Untitled2 extends Thread {
private FileLock lock; public void run() {
try {
FileOutputStream fout = new FileOutputStream("lock");
lock = fout.getChannel().lock();
System.out.println(hashCode() + " Locked");
Thread.sleep(1000);
System.out.println(hashCode() + " unLocked");
lock.release();
fout.close();
}
catch (Exception ex) {
System.out.println("Lock Error: " + hashCode() + " " + ex.getMessage());
}
}
}----------------------------------------------------
调用部分为:
package untitled7;public class Untitled1 {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
Untitled2 untitled2 = new Untitled2();
untitled2.start();
}
}
}理想产生的结果为:
[java@java java]$ java -jar test.jar
14285251 Locked
14285251 unLocked
10267414 Locked
10267414 unLocked
27553328 Locked
27553328 unLocked
11394033 Locked
11394033 unLocked
4384790 Locked
4384790 unLocked
9634993 Locked
9634993 unLocked
1641745 Locked
1641745 unLocked
11077203 Locked
11077203 unLocked
14576877 Locked
14576877 unLocked
12677476 Locked
12677476 unLocked但是在双至强的红旗Linux服务器(JDK1.5)下,却产生如下结果:
13446204 Locked
25615188 Locked
11107083 Locked
1267757 Locked
10584188 Locked
16416372 Locked
10584188 Locked
8568863 Locked
8451275 Locked
5737707 Locked
13446204 unLocked
1267757 unLocked
25615188 unLocked
11107083 unLocked
10584188 unLocked
8451275 unLocked
5737707 unLocked
16416372 unLocked
8568863 unLocked
10584188 unLocked
百思不得其解,特向兄弟们求助。
import java.nio.channels.*;public class Untitled2 extends Thread {
private FileLock lock; public void run() {
try {
FileOutputStream fout = new FileOutputStream("lock");
lock = fout.getChannel().lock();
System.out.println(hashCode() + " Locked");
Thread.sleep(1000);
System.out.println(hashCode() + " unLocked");
lock.release();
fout.close();
}
catch (Exception ex) {
System.out.println("Lock Error: " + hashCode() + " " + ex.getMessage());
}
}
}----------------------------------------------------
调用部分为:
package untitled7;public class Untitled1 {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
Untitled2 untitled2 = new Untitled2();
untitled2.start();
}
}
}理想产生的结果为:
[java@java java]$ java -jar test.jar
14285251 Locked
14285251 unLocked
10267414 Locked
10267414 unLocked
27553328 Locked
27553328 unLocked
11394033 Locked
11394033 unLocked
4384790 Locked
4384790 unLocked
9634993 Locked
9634993 unLocked
1641745 Locked
1641745 unLocked
11077203 Locked
11077203 unLocked
14576877 Locked
14576877 unLocked
12677476 Locked
12677476 unLocked但是在双至强的红旗Linux服务器(JDK1.5)下,却产生如下结果:
13446204 Locked
25615188 Locked
11107083 Locked
1267757 Locked
10584188 Locked
16416372 Locked
10584188 Locked
8568863 Locked
8451275 Locked
5737707 Locked
13446204 unLocked
1267757 unLocked
25615188 unLocked
11107083 unLocked
10584188 unLocked
8451275 unLocked
5737707 unLocked
16416372 unLocked
8568863 unLocked
10584188 unLocked
百思不得其解,特向兄弟们求助。
解决方案 »
- Struts的问题
- 请问如何发出一条Terminal(Mac机中命令行界面,linux命令行)指令,高手帮忙,100分!
- 请求java题解,我是菜鸟
- 请教一个JNI问题;请高手帮忙
- 求助大家
- java如何调用excel的接口问题
- 不懂数据库能把JAVA学得很好吗?
- 英文转中文算法,如:zh "中国,折子,zh控件,控件,zerg"
- java中如何设置网卡为混杂模式?
- spring-web.jar与spriing-webmvc.jar有何区别
- 只要改一点点, 请SWING高手帮我一把. 如何使这个JTree编历整个系统的目录
- 有SWING高手吗? 帮我改一下这个JTree 能遍历整个系统的 拜托了
package untitled7;import java.io.*;
import java.nio.channels.*;public class Untitled2 extends Thread {
private FileLock lock; private static Object latch = new Object(); public void run() {
synchronized(latch)
{
try {
FileOutputStream fout = new FileOutputStream("lock");
lock = fout.getChannel().lock();
System.out.println(hashCode() + " Locked");
Thread.sleep(1000);
System.out.println(hashCode() + " unLocked");
lock.release();
fout.close();
}
catch (Exception ex) {
System.out.println("Lock Error: " + hashCode() + " " + ex.getMessage());
}
};
}
}
RandomAccessFile raf = new RandomAccessFile( "usefilelocks.txt", "rw" );
FileChannel fc = raf.getChannel();
FileLock lock = fc.tryLock();
然后建立共享内存
MappedByteBuffer mapBuf = fc.map(FileChannel.MAP_RW,0,size);
共享内存无论在JAVA还是在C/C++,它的特点就是:
可以被多个进程打开访问;
读写操作的进程在执行读写操作时其他进程不能进行写操作;也就是当前进程/线程在操作的时候,其它
进程/线程是不可以读写的,虽然它打开了文件句柄.但不能同时读写.别外MappedByteBuffer虽然是JAVA对象,但实际操作的不是虚拟机上的内存,而是和C/C++一样直接操作的作业系统的文件内存映象.
在filelock的jdk中确实找到如下字样。
File locks are held on behalf of the entire Java virtual machine. They are not suitable for controlling access to a file by multiple threads within the same virtual machine. 但是大多情况下,(俺的单CPU的redhat linux 9.0、Sco unix 5.0.5、Windows 2003、Windows xp、红旗4.0下都没有问题),只是在多cpu的红旗4.1下有问题,弄得我好郁闷。
只好用别的办法曲折实现了,二位的办法都很不错。再次表示感谢
FileChannel fc = raf.getChannel();
FileLock fl = fc.tryLock();
if (fl.isValid()) {
System.out.println(hashCode() + " Locked");
Thread.sleep(1000);
System.out.println(hashCode() + " unLocked");
fl.release();
}
raf.close();
to humanity(很健忘了) ,没错,排它锁确实需要写访问,如使用FileOutputStream和RandomAccessFile均可以。关键目前单独使用这种方式来进行同步看来是不成了,正在考虑其他办法中