你们每个人都知道JMM的这个特性,有时候对象的引用可以在完成这个对象的构造函数之前获得值.
在JLS7中,p.17.5 最后的字段语义我们也可以阅读:
final字段的使用模型很简单:final在该对象的构造函数中设置对象的字段; 并且在对象的构造函数完成之前,不要在另一个线程可以看到的地方写入对正在构造的对象的引用.如果遵循这一点,那么当另一个线程看到该对象时,该线程将始终看到该对象的final字段的正确构造版本.(1)
在JLS之后,接下来的示例演示了如何不保证非最终字段的初始化(1Example 17.5-1.1) (2):
class FinalFieldExample {
final int x;
int y;
static FinalFieldExample f;
public FinalFieldExample() {
x = 3;
y = 4;
}
static void writer() {
f = new FinalFieldExample();
}
static void reader() {
if (f != null) {
int i = f.x; // guaranteed to see 3
int j = f.y; // could …Run Code Online (Sandbox Code Playgroud) 在某些目的中,需要JVM考虑它在具有N核心的机器上运行而不是真实数量的核心(例如4核心而不是核心16).
JVM 在一些基于Mandriva/Red Hat Linux核心的Linux版本下运行.
这个问题是边缘情况,因为我期待这个问题的各种解决方案.这不是纯粹的linux管理问题,也不是纯粹程序员的问题.
所以...任何想法?
在oracle文档中,它似乎是
<U> Optional<U> flatMap(Function<? super T,Optional<U>> mapper)
Run Code Online (Sandbox Code Playgroud)
对于mappera Function,它使参数反变,但不使返回类型协变.我想知道是否mapper可以(应该)
Function<? super T,Optional<? extends U>>
Run Code Online (Sandbox Code Playgroud)
要么
Function<? super T, ? extends Optional<? extends U>>
Run Code Online (Sandbox Code Playgroud)
?
我正在比较似乎相同的两个日期,但它们包含不同的区域名称:一个是Etc/UTC,另一个是UTC.
根据这个问题:UTC和Etc/UTC时区之间有区别吗? - 这两个区域是相同的.但我的测试失败了:
import org.junit.Test;
import java.sql.Timestamp;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import static org.junit.Assert.assertEquals;
public class TestZoneDateTime {
@Test
public void compareEtcUtcWithUtc() {
ZonedDateTime now = ZonedDateTime.now();
ZonedDateTime zoneDateTimeEtcUtc = now.withZoneSameInstant(ZoneId.of("Etc/UTC"));
ZonedDateTime zoneDateTimeUtc = now.withZoneSameInstant(ZoneId.of("UTC"));
// This is okay
assertEquals(Timestamp.from(zoneDateTimeEtcUtc.toInstant()), Timestamp.from(zoneDateTimeUtc.toInstant()));
// This one fails
assertEquals(zoneDateTimeEtcUtc,zoneDateTimeUtc);
// This fails as well (of course previous line should be commented!)
assertEquals(0, zoneDateTimeEtcUtc.compareTo(zoneDateTimeUtc));
}
}
Run Code Online (Sandbox Code Playgroud)
结果:
java.lang.AssertionError:
Expected :2018-01-26T13:55:57.087Z[Etc/UTC]
Actual :2018-01-26T13:55:57.087Z[UTC]
Run Code Online (Sandbox Code Playgroud)
更具体地说,我希望,这ZoneId.of("UTC")将等于ZoneId.of("Etc/UTC"),但它们不是!
正如@NicolasHenneaux …
在过去的几个星期里,我一直在搜索互联网,计算机程序员的思想,以及一些随机的人在我想要克服的情况.基本上,我试图做到这一点写AntiJoinBot"插件"(如果你愿意)流行的游戏的Minecraft.这就像所有其他人一样,它根据是否使用代理来阻止IP,但是这个AntiJoinBot运行在与实际服务器不同的VPS上.
这是我能够对情况做出的最佳图表(它不是那么好):
(非Minecraft服务器)连接 - >代理检查 - >重定向到服务器 - > Minecraft
唯一的问题是,我需要能够重定向IP并关闭连接,以便播放器的真实IP是连接到服务器的IP.如果无法关闭连接,则由于我们正在运行的某些插件而导致实际问题.
如果您有解决方案或更好的方法,请帮助我.
我试图编写一个方法,通过将一个字符串数组作为参数传递给该方法,从另一个类执行静态方法.
这就是我所拥有的:
public static void
executeStaticCommand(final String[] command, Class<?> provider)
{
Method[] validMethods = provider.getMethods();
String javaCommand = TextFormat.toCamelCase(command[0]);
for (Method method : validMethods) {
if (method.getName().equals(javaCommand)) {
try {
method.invoke(null, new Object[] { new Object[] { command } });
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
Throwable ex = e.getCause();
ex.printStackTrace();
}
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这样:
String[] args = new String[] { "methodName", "arg1", "arg2" };
executeStaticCommand(args, ClassName.class);
Run Code Online (Sandbox Code Playgroud)
应执行此操作:
public class ClassName {
public …Run Code Online (Sandbox Code Playgroud) 问题是静态方法Objects.deepEquals类(自Java 7):
public static boolean deepEquals(Object a, Object b) {
if (a == b)
return true;
else if (a == null || b == null)
return false;
else
return Arrays.deepEquals0(a, b);
}
Run Code Online (Sandbox Code Playgroud)
正如它在javadoc这种方法中所说:
如果参数彼此深度相等则返回true,否则返回false.
我不明白:比较的深度在哪里?正如我们在其实现中看到的那样,它只是进行引用比较,而Arrays.deepEquals0(a, b)对于简单Object和Object参数,它只调用:eq = e1.equals(e2);.那么两种物体在什么样的意义上是完全相同的呢?
如何gzip 创建的HTTP 请求org.springframework.web.client.RestTemplate?
我正在使用Spring 4.2.6Spring Boot 1.3.5(Java SE,而不是Android或Javascript在Web浏览器中).
我正在做一些非常大的POST请求,我希望压缩请求体.
JLS 8 声明每个枚举类都隐式声明了方法:
public static E[] values();
Run Code Online (Sandbox Code Playgroud)
所以,它是public按规格.
同时Class.getEnumConstantsShared()方法强制使其可访问:
final Method values = getMethod("values");
java.security.AccessController.doPrivileged(
new java.security.PrivilegedAction<Void>() {
public Void run() {
values.setAccessible(true);
return null;
}
});
@SuppressWarnings("unchecked")
T[] temporaryConstants = (T[])values.invoke(null);
Run Code Online (Sandbox Code Playgroud)
我在想:这是什么意思?
我想知道,在Java-8中实现alpha等价比较是否有任何好的方法(如果可能的话)?
显然,这两个lambda-s是α等价的.让我们假设在某些情况下我们想要发现这个事实.如何实现?
Predicate<Integer> l1 = x -> x == 1;
Predicate<Integer> l2 = y -> y == 1;
Run Code Online (Sandbox Code Playgroud)