什么是Java相当于ManualResetEvent?
我们今天遇到了一个非常令人惊讶的例外 在同步块内部,我们调用wait()并抛出它IllegalMonitorStateException.是什么导致这个?
这是在经过充分测试的开源代码中发生的:http: //svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/Mux.java?view=markup #L222
我们消除了明显的原因:
muxLockmuxLock是最后的所以,我试图想出更多牵强附会的解释.
更新:(根据评论)
我还从stacktrace和断点验证了当抛出异常时线程确实在synchronized块内.事实并非如此,其他一些不相关的代码会发出异常(除非有些东西真的让Eclipse混乱!)
我使用整数作为计数器.整数只会增加,肯定会有多个线程同时增加它.在没有其他线程尝试访问其值时,在程序执行结束时读取此计数器的值.
我假设我不必为这种仅增量计数器使用锁或任何类型的同步.这是正确的吗?如果这有任何区别,我用Java编写代码.
更新:解决方案后问题.
通常,同步是在JVM内串行化并行请求,例如
private static final Object LOCK = new Object();
public void doSomething() {
...
synchronized(LOCK) {
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
在查看Web应用程序时,"JVM全局"范围上的某些同步可能会成为性能瓶颈,仅在用户的HttpSession范围内进行同步会更有意义.
以下代码是否可能?我怀疑同步会话对象是一个好主意,但听到你的想法会很有趣.
HttpSession session = getHttpServletRequest().getSession();
synchronized (session) {
...
}
Run Code Online (Sandbox Code Playgroud)
关键问题:对于处理来自同一用户的请求的所有线程
,是否保证会话对象是同一个实例?
看来会话对象本身并不总是相同,它依赖于servlet容器(Tomcat,Glassfish,...)的实现,并且该getSession()方法可能只返回一个包装器实例.
因此,建议使用存储在会话中的自定义变量作为锁定对象.
这是我的代码提案,欢迎提供反馈:
帮手类中的某个地方,例如MyHelper:
private static final Object LOCK = new Object();
public static Object getSessionLock(HttpServletRequest request, String lockName) {
if (lockName == null) lockName = "SESSION_LOCK";
Object result = request.getSession().getAttribute(lockName);
if (result == …Run Code Online (Sandbox Code Playgroud) 好的,我已经研究了这个问题几天了,所以让我回顾一下目前为止我所知道的,这让我相信这可能是NVidia的驱动程序而不是我的代码的问题.
基本上我的游戏在运行几秒后开始出现口吃(随机帧需要70ms而不是16ms,在规则模式上).仅当在Nvidia控制面板中启用了"线程优化"设置(最新驱动程序,Windows 10)时才会发生这种情况.不幸的是,此设置默认启用,我宁愿不必让人们调整他们的设置以获得愉快的体验.
游戏不是CPU或GPU密集型(没有vsync的帧为2ms).它没有调用任何需要同步数据的openGL函数,也没有流式传输任何缓冲区或从GPU或其他任何东西读取数据.关于最简单的渲染器.
问题始终存在,当我在fmod中添加音频时,它才开始变得明显.fmod不是这个的原因(更多在后期)
尝试使用NVidia Nsight调试问题使问题消失."开始收集数据"立即导致口吃消失.这里没有骰子.
在Profiler中,"nvoglv32.dll"花费了大量的cpu时间.如果启用了线程优化,则此过程仅生成.我怀疑这是一个同步问题,因此我使用visual studio Concurrency Viewer进行调试.
调查nvidia线程上的这些CPU时间块,我可以在其callstack中获得的最早命名函数是" CreateToolhelp32Snapshot ",然后在Thread32Next中花费了大量时间.我在早期查看CPU时间时发现了分析器中的Thread32Next,所以这看起来好像我在正确的轨道上.
因此,看起来nvidia驱动程序会出于某种原因定期抓取整个过程的快照?可能是什么原因,为什么会这样做,我该如何制止呢?
这也解释了为什么一旦我在fmod中添加问题就开始变得明显,因为它抓取了所有进程线程的信息,而fmod产生了很多线程.
有帮助吗?这只是nvidia驱动程序中的一个错误,还是我可以做些什么来修复它,告诉人们禁用线程"优化"?
编辑1:我的笔记本电脑上的当前nvidia驱动程序也出现同样的问题.所以我并不疯狂
编辑2:同样的问题发生在nvidia驱动程序的版本362(以前的主要版本)上
根据我的理解,PC上的晶体因时钟偏差而臭名昭着.如果时钟总是倾斜,那么在机器之间以毫秒精度和精度同步时钟的最佳方法是什么?根据我的发现,NTP和PTP是可能的解决方案,但我想知道是否有人在stackoverflow.com上有任何经验!
我理解NTP是受欢迎的选择,但我想知道是否有人有任何PTP经验(IEEE1588)
在java中同步静态方法和非静态方法有什么区别?任何人都可以用一个例子来解释.同步方法和同步代码块有什么区别吗?
我一直在努力:
http://blog.andyet.com/2011/02/15/re-using-backbonejs-models-on-the-server-with-node
我有一些关于在服务器端共享模型的问题以及有关覆盖同步的一些问题.实时模型同步架构ftw.
模型
因此在这个例子中,他同步了他的整个应用程序状态.我的应用程序状态的一部分是用户模型,它处理诸如登录,查找他们正在使用的平台类型等事情.我使用这个错误吗?我在这个模型中有客户端会话数据,真的不需要在服务器上,我应该把它放在服务器上吗?
对于应与服务器同步的严格应用程序数据的其他模型,如何在服务器上管理这些模型?是否存在一个"视图"类型组件,它可以对模型进行更改并对模型执行服务器所需的操作?
同步
我想覆盖同步方法以与服务器和需要更新数据的任何其他客户端同步.你怎么能写一个工作客户端的同步方法 - >服务器和服务器 - >客户端,这样无论在哪里调用每个人都会更新?
术语同步原语到底意味着什么?例如:互斥,临界区,等待计时器,事件,监视器,条件变量,信号量.它们都是同步原语吗?我还没有列出任何其他同步原语吗?这些是有效的问题吗?
language-agnostic multithreading synchronization terminology
我有一个多线程Java代码,其中:
process()并将其对象传递给那里;process() 以某种方式处理对象,这可能导致更改对象状态;我创建了一个这样的方法:
public void process(Foo[] foos) {
for (final Foo foo : foos) {
if (foo.needsProcessing()) {
synchronized (foo) {
foo.process(); // foo's state may be changed here
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
据我所知,这看起来很合法.然而,的IntelliJ的检查会抱怨局部变量的同步,因为"不同的线程很可能有不同的本地实例"(这是不是适用于我,因为我不是在方法的初始化的Foo).
基本上我想在这里实现的是与方法Foo.process()同步(这不是我的选项,因为Foo是第三方库的一部分).
我习惯了没有黄色标记的代码,所以社区的任何建议都值得赞赏.在本地人做同步真的很糟糕吗?有没有替代方案可以适用于我的情况?
提前致谢!
synchronization ×10
java ×6
.net ×1
backbone.js ×1
c++ ×1
counter ×1
gps ×1
graphics ×1
increment ×1
javascript ×1
model ×1
node.js ×1
nvidia ×1
servlets ×1
session ×1
sockets ×1
terminology ×1