换句话说,我想知道在中断线程中检测到中断时,在中断之前更改变量是否始终可见.例如
private int sharedVariable;
public static void interruptTest() {
Thread someThread = new Thread(() -> {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// Is it here guaranteed that changes before interrupt are always visible here?
System.out.println(sharedVariable);
}
});
someThread.start();
Thread.sleep(1000);
sharedVariable = 10;
someThread.interrupt();
}
Run Code Online (Sandbox Code Playgroud)
我试图找到答案在Java语言规范和
java.util.concurrent包的摘要页中提到的Java教程,但interrupt
并没有提及.
我知道volatile
和其他同步原语但我需要它们吗?
我想使用 Nodejs express 获取客户端的公共 IP 地址。我在网上搜索了导致我使用这个问题的问题:
var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
console.log(ip)
Run Code Online (Sandbox Code Playgroud)
但是,在我的控制台中,我得到
::ffff:192.168.1.2
这是我的本地 IP 地址而不是公共 IP 地址
我正在寻找一种方法,如何说服借用检查人员以下代码是安全的。
SliceHolder
是一个结构,我无法更改它的接口(不同的库)。我想在 中临时设置切片SliceHolder
,调用一些方法来处理数据,然后完成借用(停止借用切片)。我的问题是,借阅检查器不允许我这样做。如果我添加到接口foo
where 'a: 'b
借用检查器将失败,self.slice = slice;
因为输入切片无法存储(即使是临时的)到结构中,寿命将更长(至少我认为这是原因)。如果我更改为where 'b: 'a
借用检查器将失败x[0] = 5
,因为它认为该切片的借用时间比 SliceHolder 的生命周期长。
我只是想临时使用切片的引用,并在函数foo
结束时以某种方式释放该引用,以便借用检查器不会将引用视为已使用。为此,我使用了self.slice = &DEFAULT;
应该说服slice
不再存储在内部的借用检查器SliceHolder
,但这不起作用。
我已经找到了不安全和原始指针(self.slice = unsafe {&*(slice as *const [u8])};
)的解决方案,但我认为这不是解决 Rust 中这个问题的正确方法。
struct SliceHolder<'a> {
slice: &'a [u8],
}
const DEFAULT: [u8; 0] = [];
impl<'a> SliceHolder<'a> {
fn foo<'b>(&mut self, slice: &'b [u8]) -> Vec<u8> {
self.slice = slice; // FIRST POSITION …
Run Code Online (Sandbox Code Playgroud)