小编Ste*_*eil的帖子

是在64位VM上编写参考原子

java内存模型强制要求写一个int是原子的:也就是说,如果你在一个线程中写一个值(由4个字节组成)并在另一个线程中读取它,你将获得所有字节或没有,但永远不会有2个新字节和2个旧字节或类似的.

这不保证long.在这里,写入之前0x1122334455667788保存的变量0可能导致另一个线程读取0x1122334400000000x0000000055667788.

现在,规范并未强制对象引用为int或long.出于类型安全的原因,我怀疑它们是保证以原子方式编写的,但在64位VM上,这些引用可能是非常好的64位值(仅仅是内存地址).

现在我的问题是:

  • 是否有任何内存模型规格(我还没有找到)?
  • 长写可疑在64位虚拟机上是原子的吗?
  • VM是否被迫将引用映射到32位?

此致,斯蒂芬

java reference atomic memory-model

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

Javascript中isPrototypeOf和instanceof有什么区别?

在我自己的一些旧代码中,我使用以下代码:

Object.prototype.instanceOf = function( iface )
{
 return iface.prototype.isPrototypeOf( this );
};
Run Code Online (Sandbox Code Playgroud)

然后我做(例如)

[].instanceOf( Array )
Run Code Online (Sandbox Code Playgroud)

这有效,但似乎以下情况也是如此:

[] instanceof Array
Run Code Online (Sandbox Code Playgroud)

现在,这肯定只是一个非常简单的例子.因此,我的问题是:

是否a instanceof b 总是一样的b.prototype.isPrototypeOf(a)

javascript inheritance prototype instanceof

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

在selenium中定位WebElements的子节点

我正在使用selenium来测试我的Web应用程序,我可以使用成功找到标签By.xpath.但是现在我需要在该节点中找到子节点.

例:

<div id="a">
    <div>
        <span />
        <input />
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

我可以:

WebElement divA = driver.findElement( By.xpath( "//div[@id='a']" ) )
Run Code Online (Sandbox Code Playgroud)

但现在我需要找到输入,所以我可以这样做:

driver.findElement( By.xpath( "//div[@id='a']//input" ) )
Run Code Online (Sandbox Code Playgroud)

但是在代码中我只有divA,而不是它的xpath ...我想做这样的事情:

WebElement input = driver.findElement( divA, By.xpath( "//input" ) );
Run Code Online (Sandbox Code Playgroud)

但是这样的功能不存在.我能这样做吗?

顺便说一句:有时候我需要找到一个<div>具有某种后代节点的东西.我怎样才能在xpath中询问"包含带有文本'hello world'的跨度的div-tag"?

java selenium xpath webdriver

41
推荐指数
2
解决办法
11万
查看次数

Bouncycastle:X509CertificateHolder到X509Certificate?

在r146之前的版本中,可以X509Certificate直接创建对象.现在该API已弃用,新的​​API仅提供X509CertificateHolder对象.

我找不到将a转换为的X509CertificateHolder方法X509Certificate.

如何才能做到这一点?

bouncycastle certificate deprecated x509

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

Java内存模型:重新排序和并发锁

java meomry模型要求synchronize在同一监视器上同步的块强制执行在这些块中修改的变量之前的实现.例:

// in thread A
synchronized( lock )
{
  x = true;
}

// in thread B
synchronized( lock )
{
  System.out.println( x );
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下x==true,只要线程A已经传递了synchronized-block ,就可以保证线程B将会看到.现在我正在重写大量代码以使用更灵活(并且被称为更快)的锁java.util.concurrent,尤其是ReentrantReadWriteLock.所以这个例子看起来像这样:

编辑:示例被打破,因为我错误地改变了代码,如matt b所示.修正如下:

// in thread A
lock.writeLock().lock();
{
  x = true;
}
lock.writeLock().unlock();

// in thread B
lock.readLock().lock();
{
  System.out.println( x );
}
lock.readLock().unlock();
Run Code Online (Sandbox Code Playgroud)

但是,我没有在内存模型规范中看到任何提示,这种锁也意味着需要订购.查看实现,它似乎依赖于对内部的volatile变量的访问AbstractQueuedSynchronizer(至少对于sun实现).然而,这不是任何规范的一部分,而且这些变量给出的内存障碍并没有真正考虑到对非易失性变量的访问,是吗?

所以,这是我的问题:

  • 假设与"旧" synchronized块相同的顺序是否安全?
  • 这是在某处记录的吗?
  • 访问任何volatile变量是否为任何其他变量的内存屏障?

此致,斯蒂芬

-

对Yanamon的评论:

看下面的代码:

// in …
Run Code Online (Sandbox Code Playgroud)

java concurrency locking synchronized

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

如何在chrome中控制webrtc的摄像头分辨率?

我们正在使用chrome中的webrtc来进行视频会议.

这可行,但它使用我们的网络摄像头,分辨率很差,宽高比为4:3.然而,凸轮可以以16:9格式传送高清视频.

我该怎么控制呢?通过更改Windows设置,chrome配置或HTML代码?

webrtc

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

将NIO与IO混合

通常,您有一个绑定的tcp端口,并在这些端口上有多个连接。至少通常有更多的连接作为绑定端口。我的情况有所不同:我想绑定许多端口,并且通常没有(或至少很少有)连接。

所以我想使用NIO接受传入的连接。

但是,我需要将接受的连接传递给现有的jsch ssh库。这需要IO套接字而不是NIO套接字,它会为每个连接生成一个(或两个)线程。但这对我很好。

现在,我认为以下几行将提供相同的结果:

Socket a = serverSocketChannel.accept().socket();
Socket b = serverSocketChannel.socket().accept();
SocketChannel channel = serverSocketChannel.accept();
channel.configureBlocking( true );
Socket c = channel.socket();
Socket d = serverSocket.accept();
Run Code Online (Sandbox Code Playgroud)

但是,返回的套接字的getInputStream()getOutputStream()功能似乎不同。仅当使用上一次调用接受套接字时,jsch才能使用它。在前三个案例中,它失败了(很抱歉:我不知道为什么)。

那么有没有办法转换这样的套接字?

java io nio blocking

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

sun jdk 6.0.24中的java.util.regex中的错误?

我的系统上有以下代码块.为什么?

System.out.println( Pattern.compile( 
   "^((?:[^'\"][^'\"]*|\"[^\"]*\"|'[^']*')*)/\\*.*?\\*/(.*)$", 
   Pattern.MULTILINE | Pattern.DOTALL ).matcher( 
   "\n\n\n\n\n\nUPDATE \"$SCHEMA\" SET \"VERSION\" = 12 WHERE NAME = 'SOMENAMEVALUE';"
   ).matches() );
Run Code Online (Sandbox Code Playgroud)

模式(旨在检测表单的注释/*...*/但不在其中'或者")应该是快速的,因为它是确定性的...为什么它需要太长时间?

java regex

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

GIT多个本地结账

我想在同一台计算机(Linux和Windows)上签出同一个git repostiory的多个分支.但是由于存储库可能很大,我宁愿只拥有一次存储库而且只有多个工作目录.

这可能吗?怎么会这样?

git version-control repository git-checkout

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

jndi LDAPS定制HostnameVerifier和TrustManager

我们正在编写一个应连接到不同LDAP服务器的应用程序。对于每台服务器,我们仅接受特定证书。该证书中的主机名无关紧要。这很容易,当我们使用LDAP和STARTTLS,因为我们可以用StartTlsResponse.setHostnameVerifier(..-)和使用StartTlsResponse.negotiate(...)具有匹配SSLSocketFactory。但是,我们还需要支持LDAPS连接。Java本机支持此功能,但前提是默认Java密钥库信任服务器证书。尽管可以替换它,但仍然不能为不同的服务器使用不同的密钥库。

现有的连接代码如下:

Hashtable<String,String> env = new Hashtable<String,String>();
env.put( Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory" );
env.put( Context.PROVIDER_URL, ( encryption == SSL ? "ldaps://" : "ldap://" ) + host + ":" + port );
if ( encryption == SSL ) {
    // env.put( "java.naming.ldap.factory.socket", "CustomSocketFactory" );
}
ctx = new InitialLdapContext( env, null );
if ( encryption != START_TLS )
    tls = null;
else {
    tls = (StartTlsResponse) ctx.extendedOperation( new StartTlsRequest() );
    tls.setHostnameVerifier( hostnameVerifier );
    tls.negotiate( sslContext.getSocketFactory() );
} …
Run Code Online (Sandbox Code Playgroud)

java ssl jndi ldap jsse

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

我的Method.invoke调用出了什么问题?

我刚刚创建了以下简约测试用例:

package testcase;

public class Main
{

    public static void main( String[] args )
        throws Throwable
    {
        if ( args.length == 0 )
            Main.class.getMethod( "main", String[].class ).invoke( null, new String[] { "test" } );
    }

}
Run Code Online (Sandbox Code Playgroud)

它应该只运行,没有输出,也没有例外.该main方法应该使用反射来调用自身.但是我得到以下异常:

Exception in thread "main" java.lang.IllegalArgumentException: argument type mismatch
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at testcase.Main.main(Main.java:10)
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚,为什么......

java reflection exception invocation java-8

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