Java 如果没有以前发生的事情,我怎么能得到锁?

Java 如果没有以前发生的事情,我怎么能得到锁?,java,concurrency,happens-before,Java,Concurrency,Happens Before,我希望java中的锁在之前不发生,以测试内存可见性的其他规则。我尝试了safe#compareAndswapInteger,AtomicInteger#weakCompareAndSet,它们似乎仍然保证了“先发制人”规则 以下是我的测试代码: @测试 public void testUnsafeMutex_case2()引发InterruptedException{ 甲级{ 字符串名; (字符串名){this.name=name;} } B类{A;} UnsafeMutex UnsafeMut

我希望java中的锁在之前不发生,以测试内存可见性的其他规则。我尝试了
safe#compareAndswapInteger
AtomicInteger#weakCompareAndSet
,它们似乎仍然保证了“先发制人”规则

以下是我的测试代码:

@测试
public void testUnsafeMutex_case2()引发InterruptedException{
甲级{
字符串名;
(字符串名){this.name=name;}
}
B类{A;}
UnsafeMutex UnsafeMutex=新的UnsafeMutex();
最终B=新B();
线程=新线程(()->{
unsafeMutex.lock();
System.out.println(b.a.name);//**我想在这里输入**
unsafeMutex.unlock();
});
unsafeMutex.lock();//将它放在线程#开始之前,根据发生在规则之前的情况,它应该首先运行
thread.start();
b、 a=newa(“name”)//在线程#启动之后,避免在
unsafeMutex.unlock();
thread.join();
}
静态类UnsafeMutex{
/**
*不添加关键字volatile,以避免背驮前发生的情况
*/
私有AtomicInteger状态=新的AtomicInteger(0);
公共无效锁(){
而(!state.weakCompareAndSet(0,1));
}
公开作废解锁(){
而(!state.weakCompareAndSet(1,0));
}
}

它不保证以前发生过,但这并不意味着它保证“以前不会发生”。@Kayaman是的,确实是这样。目前,我可以用来测试内存不可见性的唯一方法是非锁定情况。但是很多情况都是很琐碎的,如果有机会得到一个有效的例子,你需要一位JVM专家的帮助。我想这可能就是你的代码不能按预期工作的原因。它最终是一个易失性操作,有一个内存围栏,你最终得到了一个before.Re,“…测试内存可见性的其他规则…”祝你好运。当Java语言规范向您保证如果您遵守规则X、Y和Z,您的程序将表现良好时;这并不意味着如果您违反了这些规则中的任何一条,您的程序一定会表现得很糟糕。这只意味着在某些版本的JVM上,在某些操作系统上,在某些硬件平台上,在某些条件下,您的程序被允许表现不好。“它们似乎仍然保证“先发生后发生”规则?”这些规则写在规范中。如果你想知道真相,请阅读说明书,不要依赖随机读者的意见。它不能保证以前发生过,但这并不意味着它保证“以前不会发生”。@Kayaman是的,的确如此。目前,我可以用来测试内存不可见性的唯一方法是非锁定情况。但是很多情况都是很琐碎的,如果有机会得到一个有效的例子,你需要一位JVM专家的帮助。我想这可能就是你的代码不能按预期工作的原因。它最终是一个易失性操作,有一个内存围栏,你最终得到了一个before.Re,“…测试内存可见性的其他规则…”祝你好运。当Java语言规范向您保证如果您遵守规则X、Y和Z,您的程序将表现良好时;这并不意味着如果您违反了这些规则中的任何一条,您的程序一定会表现得很糟糕。这只意味着在某些版本的JVM上,在某些操作系统上,在某些硬件平台上,在某些条件下,您的程序被允许表现不好。“它们似乎仍然保证“先发生后发生”规则?”这些规则写在规范中。如果你想知道真相,请阅读说明书,不要依赖随机读者的意见。