Java中比较和交换的语义是什么?也就是说,AtomicIntegerjust 的compare和swap方法是否保证在不同线程之间对原子整数实例的特定内存位置进行有序访问,或者它是否保证对内存中所有位置的有序访问,即它就像是一个volatile一样(记忆围栏).
来自文档:
weakCompareAndSet原子地读取并有条件地写入变量但不创建任何发生前的排序,因此不提供关于除了目标之外的任何变量的先前或后续读取和写入的保证weakCompareAndSet.compareAndSet以及所有其他读取和更新操作,例如getAndIncrement读取和写入volatile变量的内存效应.从API文档中compareAndSet可以看出,它就好像是一个易变的变量.但是,weakCompareAndSet应该只是改变其特定的内存位置.因此,如果该存储器位置是单个处理器的高速缓存所独有的,weakCompareAndSet则应该比常规处理器快得多compareAndSet.
我问这个是因为我通过运行threadnum不同的线程来对以下方法进行基准测试,threadnum从1到8 不等,并且totalwork=1e9(代码是用Scala编写的,这是一种静态编译的JVM语言,但它的含义和字节码转换都是同构的在这种情况下Java的代码 - 这个简短的代码片段应该是清楚的):
val atomic_cnt = new AtomicInteger(0)
val atomic_tlocal_cnt = new java.lang.ThreadLocal[AtomicInteger] {
override def initialValue = new AtomicInteger(0)
}
def loop_atomic_tlocal_cas = {
var i = 0
val until = totalwork / threadnum
val acnt = atomic_tlocal_cnt.get
while (i < until) {
i += 1
acnt.compareAndSet(i - …Run Code Online (Sandbox Code Playgroud) 想象一下,一个web应用程序存储一些数据资源,其中一些id存储每个数据的三个附件(例如pdf).
URL方案是
data/{id}/attachment1
data/{id}/attachment2
data/{id}/attachment3
Run Code Online (Sandbox Code Playgroud)
存在用于在服务器端实现CRUD操作的GET/PUT/DELETE操作的附件的RESTful API.
让id为123,我想执行一个操作
GET
file/123/attachment1返回新附件)GET file/123/attachment2返回404)该更新应该是原子 -由服务器或什么都没有进行完整的更新.
运用简单PUT file/123/attachment1而DELETE file/123/attachment2不是原子,因为客户可以在PUT之后崩溃,并且服务器有没有暗示他应该在这种情况下,做了回退.
那么如何以RESTful方式实现操作呢?
我想过两个解决方案,但它们似乎都不是100%RESTful:
虽然这确保了原子性,但我怀疑这是RESTful,因为我使用不同的参数列表重载PATCH方法,这违反了统一接口约束.
DELETE transaction/data/123/attachment2)的附件上调用PUT和DELETE,并通过事务/ data/123上的PUT将此版本资源的提交传达给服务器.这确保了原子性,同时必须实现额外的服务器端逻辑来处理更改相同资源的多个客户端以及从未提交的崩溃客户端.虽然这似乎与REST一致,但似乎违反了无国籍的约束.事务资源的状态不是服务状态而是应用程序状态,因为每个事务资源都与单个客户端相关联.
我有点被困在这里,所以任何想法都会有所帮助,谢谢!
我必须发现我的项目中有Java代码,它在Eclipse中编译并运行良好,但在javac中抛出了编译错误.
一个独立的片段:
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set<Integer> setOfInts = new HashSet<Integer>();
Set<Object> setOfObjects = covariantSet(setOfInts);
}
public static <S, T extends S> Set<S> covariantSet(Set<T> set) {
return new HashSet<S>(set);
}
}
Run Code Online (Sandbox Code Playgroud)
在javac中编译返回:
Main.java:10: incompatible types
found : java.util.Set<java.lang.Integer>
required: java.util.Set<java.lang.Object>
Set<Object> setOfObjects = covariantSet(setOfInts);
^
Run Code Online (Sandbox Code Playgroud)
此错误现在阻止在Maven中构建项目.由于Eclipse编译器构建得更宽容,我现在必须假设片段的定义和用法如上所述,静态方法是无效的Java?
我是OSGi的新手,并创建了一个OSGi-bundle,我在Apache Felix OSGi-container中运行.捆绑包中包含一个文件资源,我需要将其作为传递给方法java.io.File.要实例化File-object,需要"file"-scheme中的URI或字符串作为字符串.如何以干净的方式检索任何这些?
我尝试使用
context.getBundle().getResource("/myfile")(org.osgi.framework.BundleContext返回类型的上下文)返回URI bundle://6.0:0/myfile.但是这个URI不能使用File(URI uri)构造函数转换为File-instance,因为它具有"bundle"-scheme.
可以尝试构建一个知道工作目录的位置路径并利用我的bundle的bundleId,但我怀疑这是最好的做法.
有任何想法吗?
设G是包含周期的未加权有向图.我正在寻找一种算法,它可以找到/创建所有非循环图G',它由G中的所有顶点和G的边缘子集组成,只要小到足以使G'非循环.
更正式:所需算法使用G并创建一组非循环图S,其中S中的每个图G'满足以下属性:
背景:原始图G模拟元素之间的成对排序.由于图中的循环,这不能被用作对所有元素的排序.因此,最大非循环图G'应该模拟这种排序的最佳可能近似,试图尽可能多地考虑成对排序关系.
在一种天真的方法中,人们可以去除所有可能的边缘组合,并在每次移除后检查是否有空隙.在这种情况下,存在强烈分支的变化树,意味着时间和空间复杂性差.
注意:问题可能与生成树有关,您可以将G'图定义为一种有向生成树.但请记住,在我的场景中,G'中的一对边可能具有相同的起始或相同的结束顶点.这与文献中使用的定向生成树的某些定义相冲突.
编辑:添加了与生成树相关的直观描述,背景信息和注释.
作为Eclipse中的Java泛型编译的后续编译,但不是在javac中,我发布了另一个在Eclipse中编译并运行良好的代码片段,但在javac中引发了编译错误.(这可以防止从Maven构建提取代码段的项目.)
自包含的代码段:
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Set<Foo<?>> setOfFoos = new HashSet<Foo<?>>();
List<Foo<?>> sortedListOfFoos = asSortedList(setOfFoos);
}
public static <T extends Comparable<T>> List<T> asSortedList(Collection<T> c) {
List<T> list = new ArrayList<T>(c);
java.util.Collections.sort(list);
return list;
}
public static class Foo<T> implements Comparable<Foo<T>> {
@Override
public int compareTo(Foo<T> o) {
return 0;
}
}
}
Run Code Online (Sandbox Code Playgroud)
在javac中编译返回:
Main.java:11: <T>asSortedList(java.util.Collection<T>) in Main cannot be applied …Run Code Online (Sandbox Code Playgroud) 我想在公司代理后面使用外部包运行spark-shell.不幸的是,通过--packages选项传递的外部包没有解决.
例如,跑步时
bin/spark-shell --packages datastax:spark-cassandra-connector:1.5.0-s_2.10
Run Code Online (Sandbox Code Playgroud)
cassandra连接器包未解析(卡在最后一行):
Ivy Default Cache set to: /root/.ivy2/cache
The jars for the packages stored in: /root/.ivy2/jars
:: loading settings :: url = jar:file:/opt/spark/lib/spark-assembly-1.6.1-hadoop2.6.0.jar!/org/apache/ivy/core/settings/ivysettings.xml
datastax#spark-cassandra-connector added as a dependency
:: resolving dependencies :: org.apache.spark#spark-submit-parent;1.0
confs: [default]
Run Code Online (Sandbox Code Playgroud)
一段时间后,连接超时,包含如下错误消息:
:::: ERRORS
Server access error at url https://repo1.maven.org/maven2/datastax/spark-cassandra-connector/1.5.0-s_2.10/spark-cassandra-connector-1.5.0-s_2.10.pom (java.net.ConnectException: Connection timed out)
Run Code Online (Sandbox Code Playgroud)
当我使用公司代理停用VPN时,包将立即解析并下载.
到目前为止我尝试了什么:
将代理公开为环境变量:
export http_proxy=<proxyHost>:<proxyPort>
export https_proxy=<proxyHost>:<proxyPort>
export JAVA_OPTS="-Dhttp.proxyHost=<proxyHost> -Dhttp.proxyPort=<proxyPort>"
export ANT_OPTS="-Dhttp.proxyHost=<proxyHost> -Dhttp.proxyPort=<proxyPort>"
Run Code Online (Sandbox Code Playgroud)
使用额外的java选项运行spark-shell:
bin/spark-shell --conf "spark.driver.extraJavaOptions=-Dhttp.proxyHost=<proxyHost> -Dhttp.proxyPort=<proxyPort>" --conf "spark.executor.extraJavaOptions=-Dhttp.proxyHost=<proxyHost> -Dhttp.proxyPort=<proxyPort>" --packages datastax:spark-cassandra-connector:1.6.0-M1-s_2.10
Run Code Online (Sandbox Code Playgroud)
是否有其他配置可能性我缺少?
我是Scala的新手,目前正在开展涉及Java和Scala模块的项目.现在我想使用byte []类型的参数从Java调用Scala方法.
Scala方法有签名: def foo(data: Array[Byte])
Java调用如下所示:foo(x)其中x具有类型byte[].
IDE告诉我它不可能:
The method foo(Array) in the type Bar is not applicable for the arguments (byte[])
Run Code Online (Sandbox Code Playgroud)
作为附加约束,不优选更改Scala方法.在Java方面,我尝试使用Byte[],但这并没有解决问题.必须存在一些转换?
假设嵌套目录foo/bar和空目录dest.我想打电话给像install foo dest这样dest包含目录foo/bar.
我尝试过以下方法:
install foo dest =>安装:省略目录"foo"
install -d foo dest =>没有任何反应
假设我有一个Foo只用类实例实例化的类Bar:
public Foo(Bar x) {
this.a = x.a();
this.b = x.b();
...
}
Run Code Online (Sandbox Code Playgroud)
现在我想测试Foo,进一步假设Bar难以创建具有所需状态的实例.作为附加约束,字段a, b, ...被声明为final,因此这些字段的setter不可用.
可能的方法是在Foo中创建一个额外的构造函数:
protected Foo(A a, B b, ...) {
this.a = a;
this.b = a;
...
}
Run Code Online (Sandbox Code Playgroud)
此构造函数仅在测试期间使用,我将在此构造函数的注释中声明.
问题:这是代码味吗?
我想到的另一个解决方案就是嘲笑Bar.想知道它是否是这种情况下的最佳做法?
java ×5
eclipse ×2
generics ×2
javac ×2
algorithm ×1
apache-felix ×1
apache-spark ×1
atomic ×1
bash ×1
bytearray ×1
concurrency ×1
constructor ×1
crud ×1
cyclic ×1
dependencies ×1
file-access ×1
graph ×1
graph-theory ×1
install ×1
ivy ×1
jvm ×1
linux ×1
osgi ×1
performance ×1
proxy ×1
rest ×1
scala ×1
shell ×1
testing ×1
transactions ×1
unit-testing ×1
unix ×1
wildcard ×1