小编Edu*_*rch的帖子

同步部分不阻止!

我昨天注意到一些非常奇怪的事情.似乎两个线程正在进入同时锁定在同一对象上的两个同步块.

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)

java concurrency multithreading synchronized

7
推荐指数
1
解决办法
781
查看次数

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

这是场景:我有一个在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)

网络共享目录中有一个文件,所有这些线程都可以访问.他们经常访问该文件.大多数情况下,文件只能由这些线程读取.但有时它是写的.

我需要一个故障安全解决方案来同步所有这些线程,以保证数据的一致性.


无效的解决方案(正确):

  1. 使用java.nio.channels.FileLock
    我能够使用FileLock类同步来自不同服务器的线程.但是这对于同一进程(servlet容器)中的线程不起作用,因为文件锁在进程范围内可用.

  2. 使用单独的文件进行同步,
    我可以创建一个单独的文件,指示进程正在读取或写入文件.此解决方案适用于所有线程,但有几个缺点:

    • 性能.创建,删除和检查文件的操作相当慢.具有一个同步文件的低权重实现将阻止并行读取文件.
    • JVM崩溃后,同步文件将保留,从而需要手动清理.
    • 我们在删除网络文件系统上的文件时已经有了奇怪的问题.
  3. 使用消息传递
    我们可以实现一个消息传递系统,线程将使用它来协调文件访问.但这对于这个问题来说似乎太复杂了.再说一次:表现会很糟糕.

有什么想法吗?

java multithreading synchronization locking file

6
推荐指数
1
解决办法
5240
查看次数

graphviz 输出 svg

我使用graphviz来取回svg

dot -Tsvg graph.dot -o file
Run Code Online (Sandbox Code Playgroud)
  1. 如何将 Graphviz 输出 svg 设置为“rect”节点而不是“polygon”
  2. 并且翻译设置为 (0,0) 而不是 (4 256)

多谢

<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)

linux svg graphviz

6
推荐指数
1
解决办法
1万
查看次数

GLIBC:调试内存泄漏:如何解释mtrace()的输出

我正在尝试调试内存泄漏问题.我正在使用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重复.但这怎么可能发生呢?

c memory-leaks glibc mtrace

5
推荐指数
2
解决办法
6180
查看次数

如何使用Java同步共享文件夹中的文件访问(或:网络级别的ReadWriteLock)

我在一台虚拟机中运行着多个应用程序。我在一台服务器上运行着多个虚拟机。而且我有多台服务器。他们都使用Linux上的共享文件夹共享文件。该文件由所有应用程序读取和写入。在写入过程中,不允许任何应用程序读取此文件。写入相同:如果应用程序正在读取文件,则不允许应用程序对其进行写入。

如何管理应用程序的同步,以便它们在读取之前等待写过程完成,反之亦然?(虚拟机内部的应用程序必须同步,服务器之间的应用程序也必须同步)

当前的实现使用“文件信号量”。如果要写入文件,则应用程序将尝试通过在共享文件夹中创建其他文件(将其命名为“ file.semaphore”)来“获取”信号灯。如果“ file.semaphore”文件已经存在,则意味着该信号已被其他应用程序锁定。这种方法的问题是我不能确保“文件存在”-测试和“创建文件”-操作是原子执行的。这样,两个应用程序可能会测试“ file.semaphore”文件,发现该文件不存在,并尝试同时创建该文件。

java synchronization file-access

5
推荐指数
1
解决办法
2万
查看次数

如何正确使用GWT中导入的CSS样式

想象一下,您使用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)

css import gwt gwt2 cssresource

5
推荐指数
1
解决办法
6361
查看次数

如何让java编译器将变量名称插入到字符串中

我经常发现自己编写这样的代码:

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)

java compiler-construction

5
推荐指数
1
解决办法
1120
查看次数

使用GXT时大量的GWT排列

我通过编译项目来获得疯狂的排列数量.如果我设置选项:

<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)

gwt war

4
推荐指数
1
解决办法
2695
查看次数

删除关联的*.py文件时,为什么要删除*.pyc文件

请参阅最后的更新.

我使用的是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)

python linux ubuntu file process

3
推荐指数
1
解决办法
2491
查看次数

如何使用spring ehcache抽象动态创建缓存

在谷歌代码上提供的ehcache-spring-annotations库中,可以使用配置选项"create-missing-caches"来动态创建动态缓存(未在ehcache.xml中定义缓存).纯弹簧ehcache抽象(Spring 3.1.1)中是否有类似的配置?或者有没有其他方法可以使用spring ehcache抽象创建动态缓存?

spring ehcache ehcache-2

3
推荐指数
1
解决办法
3855
查看次数

性能如何在100万个项目散列表和100个项目散列表之间变化

我知道散列表可能存在性能问题,但是100万项的散列表怎么能比100项的散列表快?

hashtable data-structures

2
推荐指数
2
解决办法
372
查看次数

javascript:从html中提取文本

我得到的html内容如下:

var test='<div id="test">Raj</div>';
Run Code Online (Sandbox Code Playgroud)

如何使用javascript从上面的html内容中检索值Raj.

javascript

1
推荐指数
1
解决办法
2533
查看次数

GWT Widget ID和HTML标准

OrderItem在GWT项目中有一个自定义小部件().这个小部件有一个TextBox.我将它的id设置为"Navid".但是,如果我OrderItem在面板中创建多个实例呢?然后将重复id.这会使html无效.

如何为TextBox分配唯一ID?

gwt web

-3
推荐指数
1
解决办法
2424
查看次数