java代码锁机制实例 java 代码锁

java中 请问我应该如何如何锁这段代码才符合要求public ObjectgetObject(String key,Object o) {
synchronized (map) {
if(map.get(key)==null) {
map.put(key,o)
}else {
return map.get(key);
}}// 格式没法弄,自己弄一下
}
// demol0326 的回答意思使用MyTest的实例来加锁,但是map是static的,无法锁住
// MyTest的多个实例在多个线程中的请求
//禾木双子 :如果A线程在getObject方法的第二行停止,此时B线程进入getObject后执行部分代码, 此时B线程停止,A线程启动,他不会执行'多线程处理', 仍然有线程线程安全问题,(想像一下更多的线程进入该方法的情况,num甚至会得到负值)
JAVA中的内锁机制是什么多线程同步的实现最终依赖锁机制 。我们可以想象某一共享资源是一间屋子,每个人都是一个线程 。当A希望进入房间时 , 他必须获得门锁,一旦A获得门锁,他进去后就立刻将门锁上,于是B,C,D...就不得不在门外等待,直到A释放锁出来后,B,C,D...中的某一人抢到了该锁(具体抢法依赖于JVM的实现,可以先到先得,也可以随机挑?。?然后进屋又将门锁上 。这样 , 任一时刻最多有一人在屋内(使用共享资源) 。Java语言规范内置了对多线程的支持 。对于Java程序来说,每一个对象实例都有一把“锁”,一旦某个线程获得了该锁 , 别的线程如果希望获得该锁,只能等待这个线程释放锁之后 。获得锁的方法只有一个,就是synchronized关键字 。
如何使用java的锁机制可以在临界区代码开始的位置执行Lock类的lock方法 , 为代码块加锁,而在临界区的出口使用相同Lock实例的unlock方法 , 释放临界区资源 。
Demo2-12中,主线程先创建了一个lockTest对象test,然后将相同的test对象交给两个不同的线程执行 。子线程1获取到了lock后,开始执行before sleep输出语句 , 遇到sleep后,线程1阻塞将会放弃执行权,这时线程2可以获取执行权,当线程2执行lock方法时,发现锁已经被别的线程获?。韵叱?阻塞等待lock的释放 。线程1从sleep中被唤醒后,将继续执行aftersleep语句,之后释放了锁,此时线程2从锁等待中被唤醒,执行临近区的内容,因此Demo2-12的输出是先线程1的两条语句,之后才输出线程2的两条语句 。而Demo2-13在没有锁的保护下,程序无法保证先将线程1的两条语句输出后再执行线程2的输出,因此,Demo2-13的输出结果是交叉的 。
java中文件加锁机制是怎么实现的 。Java中文件加锁机制如下:
在对文件操作过程中,有时候需要对文件进行加锁操作,防止其他线程访问该文件 。对文件的加锁方法有两种:
第一种方法:使用RandomAccessFile类操作文件 。
在java.io.RandomAccessFile类的open方法,提供了参数实现独占的方式打开文件:
RandomAccessFile raf = new RandomAccessFile(file, "rws");
其中的“rws”参数,rw代表读取和写入,s代表了同步方式,也就是同步锁 。这种方式打开的文件,就是独占方式的 。
第二种方法:使用sun.nio.FileChannel对文件进行加锁 。
代码:
RandomAccessFile raf = new RandomAccessFile("file.txt", "rw");
FileChannel fc = raf.getChannel();
FileLock fl = fc.tryLock();
if(fl.isValid())
【java代码锁机制实例 java 代码锁】System.out.println("You have got the file lock.");
以上是通过RandomAccessFile来获得文件锁的,方法如下:
代码:
FileOutputStream fos = new FileOutputStream("file.txt");
FileChannel fc = fos.getChannel(); //获取FileChannel对象
FileLock fl = fc.tryLock();//or fc.lock();
if(null != fl)
System.out.println("You have got file lock.");
//TODO write content to file
//TODO write end, should release this lock
fl.release(); //释放文件锁
fos.close;//关闭文件写操作
如果在读文件操作的时候,对文件进行加锁 , 操作过程如下:
FileChannel也可以从FileInputStream中直接获得,但是这种直接获得FileChannel的对象直接去操作FileLock会报异常NonWritableChannelException,需要自己去实现getChannel方法,代码如下:
private static FileChannel getChannel(FileInputStream fin, FileDescriptor fd) {
FileChannel channel = null;
synchronized(fin){
channel = FileChannelImpl.open(fd, true, true, fin);
return channel;
}
}
其实,看FileInputStream时 , 发现getChannel方法与我们写的代码只有一个地方不同,即open方法的第三个参数不同,如果设置为false,就不能锁住文件了 。缺省的getChannel方法,就是false,因此,不能锁住文件 。
关于java代码锁机制实例和java 代码锁的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息 , 记得收藏关注本站 。

    推荐阅读