草庐IT

Java I/O : Ensure a file is not locked by another process before any r/w operation

我在基于Java7WatchServiceAPI跟踪目录中文件内容的应用程序中遇到了一个反复出现的问题。当底层文件系统触发文件修改事件时,我想立即计算其SHA-256。但经常会发生另一个进程打开文件(即Word),从而保留独占锁并阻止我的应用程序进行任何读/写操作。如果针对打开的文件创建了任何流/channel,则会抛出FileNotFoundException或nioAPI的FileSystemException以及如下消息:Theprocesscannotaccessthefilebecauseitisbeingusedbyanotherprocess当文件在fs上实际上不存在时,

java - 在Java中,监视器和锁有什么区别

使用synchronized关键字的方法,使用javap命令查看字节码,发现使用了monitor,如果实现synchronized的时候可以调用monitor,我的理解是这样吧?如果不正确请更正。他们之间是什么关系?锁和监视器是什么关系? 最佳答案 来自LocksandSynchronization的官方文档:Synchronizationisbuiltaroundaninternalentityknownastheintrinsiclockormonitorlock.(TheAPIspecificationoftenreferst

java - Java中如何在没有顺序约束的情况下获取多个锁?

所以我有类似的代码synchronized(objectOne){dostuff}synchronized(objectTwo){dostuff}问题是程序将等待objectOne的锁,即使objectTwo的锁可用。我想做的是:尝试同时锁定objectOne和objectTwo,无论您先获得哪个锁,都为该锁做一些事情。我想出了一个解决方案,但我认为它很老套,我想知道是否有人有更好的想法。这是我的想法:启动2个线程,每个线程等待锁,然后主线程将等待CountDownLatch。.所以你最终得到这样的东西:CountDownLatchlatch=newCountDownLatch(2);

java - 有条件地定义同步块(synchronized block)

假设我有一个方法:publicvoidrun(){synchronized(this.foo){}}但有时当我运行这个方法时,我不需要同步任何东西。什么是有条件地同步某些东西的好模式?我能想到的唯一模式是回调,像这样:publicvoidconditionalSync(Runnabler){if(bar){r.run();return;}synchronized(this.foo){r.run();}}publicvoidrun(){this.conditionalSync(()->{});}还有没有回调的其他方法吗? 最佳答案 也

java - 如果不会发生争用,读取时是否需要同步

考虑下面的代码狙击手:packagesync;publicclassLockQuestion{privateStringmutable;publicsynchronizedvoidsetMutable(Stringmutable){this.mutable=mutable;}publicStringgetMutable(){returnmutable;}}在时间Time1线程Thread1将更新“可变”变量。setter中需要同步,以便将内存从本地缓存刷新到主内存。在时间Time2(Time2>Time1,无线程争用)线程Thread2将读取可变值。问题是——我需要把synchroni

java - CLR 是否执行 "lock elision"优化?如果不是,为什么不呢?

JVM执行一种称为锁省略的巧妙技巧,以避免锁定仅对一个线程可见的对象的成本。这里有一个很好的技巧描述:http://www.ibm.com/developerworks/java/library/j-jtp10185/.NetCLR是否做类似的事情?如果不是,那为什么不呢? 最佳答案 它很简洁,但它有用吗?我很难想出一个例子,编译器可以证明锁是线程本地的。默认情况下,几乎所有类都不使用锁定,当您选择一个锁定的类时,在大多数情况下,它将从某种静态变量中引用,无论如何都会阻碍编译器优化。另一件事是javavm在其证明中使用了逃逸分析。而

java - 锁拆分与锁 strip 化

以下是Joshua的EffectiveJava的摘录:Ifyoudosynchronizeyourclassinternally,youcanusevarioustechniquestoachievehighconcurrency,suchaslocksplitting,lockstriping,andnonblockingconcurrencycontrol.上面表明锁拆分和锁strip化是两种不同的技术,但是当我试图找到它们之间的区别时,我找不到区别。它们之间有区别还是一样? 最佳答案 锁拆分是关于为类功能的不同部分使用不同的锁

java - ConcurrentHashMap 与基于 ReentrantReadWriteLock 的用于重新加载的自定义映射

Java大师,目前我们有一个HashMap经常读取并偶尔修改,我们遇到了在修改/重新加载期间,读取操作返回null的问题这是NotAcceptable。要解决这个问题,我有以下选项:A.使用ConcurrentHashMap这看起来像是首选,但我们正在谈论的操作是reload()-表示clear()其次是replaceAll().所以如果Map正在阅读帖子clear()和前replaceAll()它返回null这是不可取的。即使我synchronize这并不能解决问题。B.基于ReentrantReadWriteLock创建另一个实现我将在哪里创建acquireWriteLock之前r

java - 延迟加载的单例 : Double-checked locking vs Initialization on demand holder idiom

我需要在并发环境中延迟加载资源。加载资源的代码应该只执行一次。两者都是Double-checkedlocking(使用JRE5+和volatile关键字)和Initializationondemandholderidiom似乎很适合这份工作。仅通过查看代码,按需初始化持有人惯用语似乎更清晰、更高效(但是,嘿,我在这里猜测)。尽管如此,我仍将不得不注意并记录我的每个单例的模式。至少对我来说,很难理解为什么当场写成这样的代码......我的问题是:哪种方法更好?为什么?如果你的答案是否定的。您将如何在JavaSE环境中满足这一要求?备选方案我可以为此使用CDI而不是将它强加于我的整个项目吗

java - 如何避免两个不同的线程从数据库中读取相同的行(Hibernate 和 Oracle 10g)

假设我有两个不同的线程,T1和T2,同时访问同一个数据库并从同一个表中获取数据。现在在线程启动时,我需要从表中获取数据并将行存储到一个集合中,然后我将使用它在其他地方执行一些工作。我不希望两个线程能够处理相同的数据,因为这会导致重复(和长时间)的工作。更具体地说,这是一个企业应用程序,需要在启动时加载一些记录并将其存储在一个集合中以执行一些额外的工作。问题在于,在集群环境中,这可能会导致两个不同的实例加载相同的数据,因此可能会重复工作。所以我希望行仅由单个实例加载一次。我怎样才能避免这种情况?我目前正在使用Hibernate和Oracle10g。这些是我到目前为止的解决方案:以编程方式