java内存模型强制要求写一个int是原子的:也就是说,如果你在一个线程中写一个值(由4个字节组成)并在另一个线程中读取它,你将获得所有字节或没有,但永远不会有2个新字节和2个旧字节或类似的.
这不保证long.在这里,写入之前0x1122334455667788保存的变量0可能导致另一个线程读取0x112233440000000或0x0000000055667788.
现在,规范并未强制对象引用为int或long.出于类型安全的原因,我怀疑它们是保证以原子方式编写的,但在64位VM上,这些引用可能是非常好的64位值(仅仅是内存地址).
现在我的问题是:
此致,斯蒂芬
在我自己的一些旧代码中,我使用以下代码:
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)?
我正在使用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"?
在r146之前的版本中,可以X509Certificate直接创建对象.现在该API已弃用,新的API仅提供X509CertificateHolder对象.
我找不到将a转换为的X509CertificateHolder方法X509Certificate.
如何才能做到这一点?
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块相同的顺序是否安全?此致,斯蒂芬
-
对Yanamon的评论:
看下面的代码:
// in …Run Code Online (Sandbox Code Playgroud) 我们正在使用chrome中的webrtc来进行视频会议.
这可行,但它使用我们的网络摄像头,分辨率很差,宽高比为4:3.然而,凸轮可以以16:9格式传送高清视频.
我该怎么控制呢?通过更改Windows设置,chrome配置或HTML代码?
通常,您有一个绑定的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才能使用它。在前三个案例中,它失败了(很抱歉:我不知道为什么)。
那么有没有办法转换这样的套接字?
我的系统上有以下代码块.为什么?
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)
模式(旨在检测表单的注释/*...*/但不在其中'或者")应该是快速的,因为它是确定性的...为什么它需要太长时间?
我想在同一台计算机(Linux和Windows)上签出同一个git repostiory的多个分支.但是由于存储库可能很大,我宁愿只拥有一次存储库而且只有多个工作目录.
这可能吗?怎么会这样?
我们正在编写一个应连接到不同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) 我刚刚创建了以下简约测试用例:
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 ×7
atomic ×1
blocking ×1
bouncycastle ×1
certificate ×1
concurrency ×1
deprecated ×1
exception ×1
git ×1
git-checkout ×1
inheritance ×1
instanceof ×1
invocation ×1
io ×1
java-8 ×1
javascript ×1
jndi ×1
jsse ×1
ldap ×1
locking ×1
memory-model ×1
nio ×1
prototype ×1
reference ×1
reflection ×1
regex ×1
repository ×1
selenium ×1
ssl ×1
synchronized ×1
webdriver ×1
webrtc ×1
x509 ×1
xpath ×1