Tag: 锁定

在Java中锁定文件的存在

简短版本:为什么File.createNewFile()不能用于文件锁定? 或者更具体地说:如果用于锁定应用程序数据目录,是否会出现问题? 细节: 我想使用锁定文件保护我的应用程序数据目录:如果文件lock存在,则目录被锁定,应用程序退出并显示错误消息。 如果它不存在,将创建它并继续应用程序。 退出时,文件将被删除。 锁定将不会经常创建(即性能不是问题),并且在出现某些错误时手动删除锁定文件没有问题(即无法删除文件不成问题)。 代码看起来像这样: File lockFile = new File(“lock”); boolean lockCreated = lockFile.createNewFile(); if (lockCreated) { // do stuff lockFile.delete(); } else { System.err.println(“Lockfile exists => please retry later”); // alternative: Wait and retry eg 5 times } 现在我对createNewFile()的Javadoc有点困惑: 当且仅当具有此名称的文件尚不存在时,以primefaces方式创建由此抽象路径名命名的新空文件。 检查文件是否存在以及文件的创建(如果不存在)是针对可能影响文件的所有其他文件系统活动的primefaces操作 。 注意: 此方法不应用于文件锁定,因为无法使生成的协议可靠地工作。 应该使用FileLock工具。 考虑到存在检查和文件创建是primefaces的,注释中提到的潜在问题是什么? 2007年12月的这篇论坛post表明,根据File.delete()的Javadoc,存在“显着的平台差异”(尽管至少从Java SE 1.4.2开始我找不到这样的声明)。 但即使存在这样的差异:它们真的会导致锁定失败(即两个进程认为数据目录同时可用)吗? 注意:我不想要以下任何一项: […]

几个线程可以在Java中对同一个监视器进行锁定吗?

目前我们正在分析一个tomcat线程转储。 在tomcat上同时运行的所有线程的单个线程转储包含以下行: … “soldOutJmsConsumerContainer-1” prio=10 tid=0x00007f8409c14800 nid=0x231 in Object.wait() [0x00007f8403a9f000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:485) at com.tc.object.RemoteObjectManagerImpl.waitUntilRunning(RemoteObjectManagerImpl.java:150) at com.tc.object.RemoteObjectManagerImpl.basicRetrieve(RemoteObjectManagerImpl.java:216) – locked (a com.tc.object.RemoteObjectManagerImpl) … “catalina-exec-33” daemon prio=10 tid=0x0000000041bc4000 nid=0x832 in Object.wait() [0x00007f8400f73000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:485) at com.tc.object.RemoteObjectManagerImpl.waitUntilRunning(RemoteObjectManagerImpl.java:150) at com.tc.object.RemoteObjectManagerImpl.basicRetrieve(RemoteObjectManagerImpl.java:216) – locked (a com.tc.object.RemoteObjectManagerImpl) […]

是否由Java编译器优化了空的同步块?

假设在我的代码中某处我写了一个空的synchronized块: synchronized(obj){ //No code here } 因为同步块不包含任何代码,JIT编译器是否会通过不锁定obj来优化它,因为它没有用? Java编译器做类似的技巧,如Lock粗化,但这个同步块也会被优化掉吗? 编辑: 根据assylias的观点, synchronized(new Object()){ //empty block } JIT编译器现在能够优化它,因为我使用的是一个不会逃避我的方法的Object吗?

为什么使用私有锁而不是内部锁?

在阅读同步时,我遇到了“监控模式”来封装可变状态。 以下是示例代码 public class MonitorLock { private final Object myLock = new Object(); Widget widget; void someMethod() { synchronized(myLock) { // Access or modify the state of widget } } } 以任何方式更好地拥有私人锁而不是内在锁吗?

如何在不同的应用程序级别上锁定文件?

这是场景:我有一个在servlet容器中运行的multithreadingjava Web应用程序。 应用程序在servlet容器中多次部署。 有多个servlet容器在不同的服务器上运行。 也许这个图表清楚地说明了: server1 +- servlet container +- application1 | +- thread1 | +- thread2 +- application2 +- thread1 +- thread2 server2 +- servlet container +- application1 | +- thread1 | +- thread2 +- application2 +- thread1 +- thread2 网络共享目录中有一个文件,所有这些线程都可以访问。 他们经常访问该文件。 大多数情况下,文件只能被这些线程读取。 但有时它是写的。 我需要一个故障安全解决方案来同步所有这些线程,以保证数据的一致性。 不起作用的解决方案(正确) : 使用java.nio.channels.FileLock 我能够使用FileLock类同步来自不同服务器的线程。 但是这对于同一进程(servlet容器)中的线程不起作用,因为文件锁在进程范围内可用。 使用单独的文件进行同步 我可以创建一个单独的文件,指示进程正在读取或写入文件。 此解决方案适用于所有线程,但有几个缺点: 性能。 […]

Java文件锁定

我有几个线程(其中一些由Process X生成,其他由Process Y生成, 等等 ),每个线程都需要写入一个文件MyFile 。 但是,如果Thread T1首先开始写入MyFile ,那么,当Thread T2开始写入时,它需要等待T1 释放文件 ,以便它可以读取在Thread T1中写入的内容。 换句话说,每个线程都有一个finalizeThread方法,如下所示: private void finalizeThread() { File f = new File(“MyFile.dat”); f.createNewFile(); // atomically creates the file, if it doesn’t exist locked_section { readContentsFromFile(f); // read contents if some other thread already modified the file modifyContentsFromFile(f); // modify writeFile(f); // write, so that […]

信号量与条件(ReentrantLock)之间的区别

有谁知道方法acquire ()和release () ( java.util.concurrent.Semaphore )和await ()和signal (new ReentrantLock().newCondition() )之间的区别。 你能为这些方法公开一个伪代码吗?

Java 6 JVM Hang

为长篇文章道歉,但我想知道在向Sun提交错误报告之前是否可以对此进行更多关注。 JVM:6u11 操作系统:Windows XP SP3 硬件:AMD Athlon 64 X2 4600+ @ 2.41GHz,内存3.25 GB。 我相信我在JVM中遇到了一个错误,其中没有给出监视器的线程。 在以下线程跟踪中,监视器被RelayedMessages-0000000001获取,最终等待它; 该线程随后得到通知。 但是,即使列出的所有线程都在竞争监视器,也没有人获得它。 我保证每个引用monitor 的线程都完成了线程转储。 转储是使用Java VisualVM获得的,在16个小时的时间内获得三次,并且每次都显示为一致(这些线程未更改)。 是否有人不同意我的评估,即JVM无法将监视器交付给任何符合条件的线程,何时应将其交付给其中一个? “RelayedMessages-0000000001” daemon prio=6 tid=0x03694400 nid=0x1750 waiting for monitor entry [0x05e1f000..0x05e1fc94] java.lang.Thread.State: BLOCKED (on object monitor) at java.lang.Object.wait(Native Method) at com.companyremoved.thd.EzWaiter.ezWait(EzWaiter.java:249) – locked (a com.companyremoved.system.coms.ComsSender) at com.companyremoved.ioc.IsolatedObject.waitWithinMessage(IsolatedObject.java:352) – locked (a com.companyremoved.system.coms.ComsSender) at com.companyremoved.system.coms.ComsSender.waitForAvailablePipe(ComsSender.java:219) at […]

java:wait(),notify()和synchronized块

我了解到调用Object的wait()方法将释放对象监视器(如果存在)。 但是我有一些关于通过另一个线程调用此对象的notify()问题: 如果另一个(第3个)线程同时拥有对象监视器,那么等待线程是否会被唤醒? 如果第三个线程在这个对象上调用wait() ,那么等待线程会被唤醒吗? 是否可以确定线程是否在等待通知特定对象(java 1.4 / java 5) 如果在finalize()方法中调用wait()会发生什么?

你能安全地同步Java方法参数吗?

拿这个代码: public class MyClass { private final Object _lock = new Object(); private final MyMutableClass _mutableObject = new MyMutableClass() public void myMethod() { synchronized(_lock) { // we are synchronizing on instance variable _lock // do something with mutableVar //(ie call a “set” method on _mutableObject) } } } 现在,想象一下将myMethod()中的代码委托给传递锁的一些辅助类 public class HelperClass { public helperMethod(Object […]