我昨天注意到一些非常奇怪的事情.似乎两个线程正在进入同时锁定在同一对象上的两个同步块.
MyClass包含相关代码的class()看起来类似于:
private static int[] myLock = new int[0];
protected static int methodA(final long handle, final byte[] sort) {
synchronized (myLock) {
return xsMethodA(handle, sort);
}
}
protected static int methodB(final long handle) {
synchronized (myLock) {
return xsMethodB(handle);
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了一个运行上面类的应用程序的线程转储,当我看到这个时非常惊讶:
"http-8080-136" daemon prio=10 tid=0x00000000447df000 nid=0x70ed waiting for monitor entry [0x00007fd862aea000]
java.lang.Thread.State: BLOCKED (on object monitor)
at com.MyClass.methodA(MyClass.java:750)
- locked <0x00007fd8a6b8c790> (a [I)
at com.SomeOtherClass.otherMethod(SomeOtherClass.java:226)
...
"http-8080-111" daemon prio=10 tid=0x00007fd87d1a0000 nid=0x70c8 waiting for monitor entry [0x00007fd86e15f000]
java.lang.Thread.State: BLOCKED …Run Code Online (Sandbox Code Playgroud) 这是场景:我有一个在servlet容器中运行的多线程java Web应用程序.应用程序在servlet容器中多次部署.有多个servlet容器在不同的服务器上运行.
也许这个图表清楚地说明了:
server1
+- servlet container
+- application1
| +- thread1
| +- thread2
+- application2
+- thread1
+- thread2
server2
+- servlet container
+- application1
| +- thread1
| +- thread2
+- application2
+- thread1
+- thread2
Run Code Online (Sandbox Code Playgroud)
网络共享目录中有一个文件,所有这些线程都可以访问.他们经常访问该文件.大多数情况下,文件只能由这些线程读取.但有时它是写的.
无效的解决方案(正确):
使用java.nio.channels.FileLock
我能够使用FileLock类同步来自不同服务器的线程.但是这对于同一进程(servlet容器)中的线程不起作用,因为文件锁在进程范围内可用.
使用单独的文件进行同步,
我可以创建一个单独的文件,指示进程正在读取或写入文件.此解决方案适用于所有线程,但有几个缺点:
使用消息传递
我们可以实现一个消息传递系统,线程将使用它来协调文件访问.但这对于这个问题来说似乎太复杂了.再说一次:表现会很糟糕.
有什么想法吗?
我使用graphviz来取回svg
dot -Tsvg graph.dot -o file
Run Code Online (Sandbox Code Playgroud)
多谢
<g id="graph1" class="graph" transform="scale(1 1) rotate(0) translate(4 256)">
<polygon fill="white" stroke="white" points="-4,5 -4,-256 265,-256 265,5 -4,5"/>
digraph G {
a1 [id=a1 shape=rectangle];
a2 [id=a2 shape=rectangle];
a3 [id=a3 shape=rectangle];
a4 [id=a4 shape=rectangle];
a5 [id=a5 shape=rectangle];
a1 -> a5;
a2 -> a1;
a2 -> a5;
a3 -> a2;
a4 -> a2;
a4 -> a4;
}
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" …Run Code Online (Sandbox Code Playgroud) 我正在尝试调试内存泄漏问题.我正在使用mtrace()来获取malloc/free/realloc跟踪.我已经运行了我的编程,现在有一个巨大的日志文件.到现在为止还挺好.但是我在解释文件时遇到了问题.看看这些线:
@ /usr/java/ibm-java2-x86_64-50/jre/bin/libj9prt23.so:[0x2b270a384a34] + 0x1502570 0x68
@ /usr/java/ibm-java2-x86_64-50/jre/bin/libj9prt23.so:[0x2b270a384a34] + 0x1502620 0x30
@ /usr/java/ibm-java2-x86_64-50/jre/bin/libj9prt23.so:[0x2b270a384a34] + 0x2aaab43a1700 0xa80
@ /usr/java/ibm-java2-x86_64-50/jre/bin/libj9prt23.so:[0x2b270a384a34] + 0x1501460 0xa64
Run Code Online (Sandbox Code Playgroud)
奇怪的是,一个调用(相同的返回地址)负责4个分配.
更奇怪的是:
@ /usr/java/ibm-java2-x86_64-50/jre/bin/libj9prt23.so:[0x2b270a384a34] + 0x2aaab43a1700 0xa2c
…
@ /usr/java/ibm-java2-x86_64-50/jre/bin/libj9prt23.so:[0x2b270a384a34] + 0x2aaab43a1700 0xa80
Run Code Online (Sandbox Code Playgroud)
在这两行之间,块0x2aaab43a1700永远不会被释放.
有谁知道如何解释这个?一次调用如何导致4次分配?而malloc如何返回之前已分配的地址?
编辑2008/09/30:分析GLIBC(mtrace.pl)提供的mtrace()输出的脚本在这里没有任何帮助.它只会说:Alloc 0x2aaab43a1700重复.但这怎么可能发生呢?
我在一台虚拟机中运行着多个应用程序。我在一台服务器上运行着多个虚拟机。而且我有多台服务器。他们都使用Linux上的共享文件夹共享文件。该文件由所有应用程序读取和写入。在写入过程中,不允许任何应用程序读取此文件。写入相同:如果应用程序正在读取文件,则不允许应用程序对其进行写入。
如何管理应用程序的同步,以便它们在读取之前等待写过程完成,反之亦然?(虚拟机内部的应用程序必须同步,服务器之间的应用程序也必须同步)
当前的实现使用“文件信号量”。如果要写入文件,则应用程序将尝试通过在共享文件夹中创建其他文件(将其命名为“ file.semaphore”)来“获取”信号灯。如果“ file.semaphore”文件已经存在,则意味着该信号已被其他应用程序锁定。这种方法的问题是我不能确保“文件存在”-测试和“创建文件”-操作是原子执行的。这样,两个应用程序可能会测试“ file.semaphore”文件,发现该文件不存在,并尝试同时创建该文件。
想象一下,您使用UiBinder创建了以下简单小部件:
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui">
<ui:style type="my.package.Widget1.Widget1Style">
.childWidgetStyle {
border-width: 1px;
border-style: dotted;
}
</ui:style>
<g:TextArea styleName="{style.childWidgetStyle}"/>
</ui:UiBinder>
Run Code Online (Sandbox Code Playgroud)
package my.package;
// some imports here
public class Widget1 extends Composite {
private static Widget1UiBinder uiBinder = GWT.create(Widget1UiBinder.class);
interface Widget1UiBinder extends UiBinder<Widget, Widget1> {
}
public interface Widget1Style extends CssResource {
String childWidgetStyle();
}
@UiField
TextArea textArea;
public Widget1(String text) {
initWidget(uiBinder.createAndBindUi(this));
textArea.setText(text);
}
}
Run Code Online (Sandbox Code Playgroud)
在您创建的另一个(父)窗口小部件中使用此简单窗口小部件:
<!DOCTYPE ui:UiBinder SYSTEM "http://dl.google.com/gwt/DTD/xhtml.ent">
<ui:UiBinder xmlns:ui="urn:ui:com.google.gwt.uibinder"
xmlns:g="urn:import:com.google.gwt.user.client.ui">
<ui:style>
.parentWidgetStyle .childWidgetStyle {
margin-bottom: 10px; …Run Code Online (Sandbox Code Playgroud) 我经常发现自己编写这样的代码:
throwExceptionWhenEmpty(fileType, "fileType");
throwExceptionWhenEmpty(channel, "channel");
throwExceptionWhenEmpty(url, "url");
Run Code Online (Sandbox Code Playgroud)
该throwExceptionWhenEmpty方法执行以下操作:
private void throwExceptionWhenEmpty(final String var, final String varName) {
if (var == null || var.isEmpty()) {
throw new RuntimeException("Parameter " + varName + " may not be null or empty.");
}
}
Run Code Online (Sandbox Code Playgroud)
我想避免这种明显的冗余将变量名称作为字符串传递.有没有一种方法java编译器可以为我插入字符串中的变量名称?
如果我能写出这样的东西,我会很高兴的:
throwExceptionWhenEmpty(fileType, nameOf(fileType));
Run Code Online (Sandbox Code Playgroud) 我通过编译项目来获得疯狂的排列数量.如果我设置选项:
<set-property name="user.agent" value="gecko1_8" />
Run Code Online (Sandbox Code Playgroud)
我得到:编译1008个排列
如果我设置:
<set-property name="locale" value="de"/>
<set-property name="user.agent" value="gecko1_8" />
Run Code Online (Sandbox Code Playgroud)
我得到:编译36个排列
这是完整的 .gwt.xml
<!-- Inherit the core Web Toolkit stuff. -->
<inherits name='com.google.gwt.user.User' />
<!-- We need the JUnit module in the main module, -->
<!-- otherwise eclipse complains (Google plugin bug?) -->
<inherits name='com.google.gwt.junit.JUnit' />
<!-- GXT Theme -->
<inherits name='com.sencha.gxt.theme.gray.Gray' />
<!-- caneldar -->
<inherits name='com.bradrydzewski.gwt.calendar.Calendar' />
<inherits name='com.bradrydzewski.gwt.calendar.theme.google.Google' />
<inherits name='com.allen_sauer.gwt.dnd.gwt-dnd' />
<!-- Other module inherits -->
<inherits name="com.google.gwt.json.JSON" />
<inherits name='com.google.gwt.visualization.Visualization' /> …Run Code Online (Sandbox Code Playgroud) 请参阅最后的更新.
我使用的是Ubuntu Linux 11.10,Python 3.
我写了一个Python脚本,它使用pyuic4将一些Qt*.ui文件转换为*.py.然后我想将获得的*.py文件编译为*.pyc并删除*.py文件.
出于某种原因,当我删除转换后的*.py文件时,*.pyc版本也会被删除:
try:
command = 'pyuic4 -o /home/vic/ui_form.py /home/vic/form.ui'
output = subprocess.check_output(command, shell= True, stderr= subprocess.STDOUT)
except subprocess.CalledProcessError as e:
print('Failed:', e.output)
else:
print('Converted %s to %s' % (source, targetName))
# convert *.py to *.pyc and delete the source
source = '/home/vic/ui_form.py'
target = source + 'c' # py -> pyc
py_compile.compile(source, target)
#shutil.copy(target, target + '_') # if uncommented - the *.pyc_ file remains
os.remove(source) # if commented - both *.py and *.pyc files …Run Code Online (Sandbox Code Playgroud) 在谷歌代码上提供的ehcache-spring-annotations库中,可以使用配置选项"create-missing-caches"来动态创建动态缓存(未在ehcache.xml中定义缓存).纯弹簧ehcache抽象(Spring 3.1.1)中是否有类似的配置?或者有没有其他方法可以使用spring ehcache抽象创建动态缓存?
我知道散列表可能存在性能问题,但是100万项的散列表怎么能比100项的散列表快?
我得到的html内容如下:
var test='<div id="test">Raj</div>';
Run Code Online (Sandbox Code Playgroud)
如何使用javascript从上面的html内容中检索值Raj.
我OrderItem在GWT项目中有一个自定义小部件().这个小部件有一个TextBox.我将它的id设置为"Navid".但是,如果我OrderItem在面板中创建多个实例呢?然后将重复id.这会使html无效.
如何为TextBox分配唯一ID?
java ×4
gwt ×3
file ×2
linux ×2
c ×1
concurrency ×1
css ×1
cssresource ×1
ehcache ×1
ehcache-2 ×1
file-access ×1
glibc ×1
graphviz ×1
gwt2 ×1
hashtable ×1
import ×1
javascript ×1
locking ×1
memory-leaks ×1
mtrace ×1
process ×1
python ×1
spring ×1
svg ×1
synchronized ×1
ubuntu ×1
war ×1
web ×1