如果我决定使用非线程安全的集合并同步其访问权限,我是否需要同步构造函数中的任何变异?例如,在下面的代码中,我理解列表的引用对于构造后的所有线程都是可见的,因为它是最终的.但我不知道这是否构成安全发布,因为构造函数中的add不是同步的,而是在ArrayList的elementData数组中添加一个引用,这是非final的.
private final List<Object> list;
public ListInConstructor()
{
list = new ArrayList<>();
// synchronize here?
list.add(new Object());
}
public void mutate()
{
synchronized (list)
{
if (list.checkSomething())
{
list.mutateSomething();
}
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个用Rust和wasm-bindgen编写的Web应用程序需要存储状态.状态存储如下:
lazy_static! {
static ref ID_TO_DATA: Mutex<HashMap<u32, Data>> = Mutex::new(HashMap::new());
}
pub struct Data {
pub coder_id: u16,
pub bools: Vec<bool>,
pub ints: Vec<i32>,
pub strings: Vec<String>,
}
Run Code Online (Sandbox Code Playgroud)
我尝试以下方法删除数据并释放内存,并从中删除数据,HashMap并且不会报告错误:
#[wasm_bindgen]
pub fn remove_data(id: u32) {
match ID_TO_DATA.lock().unwrap().remove(&id) {
Some(data) => {
std::mem::drop(data);
}
None => {}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,浏览器选项卡使用的内存不会丢失(使用Chrome 67).我使用Windows的任务管理器,并观察相关进程/选项卡的内存增长到近2GB,然后在我的程序删除所有条目后,我等了一会儿,内存仍然接近2GB.
我也试过以下,但得到了这个错误: RuntimeError: memory access out of bounds
#[wasm_bindgen]
pub fn remove_data(id: u32) {
match ID_TO_DATA.lock().unwrap().remove(&id) {
Some(mut data) => {
unsafe {
std::ptr::drop_in_place(&mut data);
}
}
None => …Run Code Online (Sandbox Code Playgroud) 我正在尝试用 Rust 编写一个数据存储,它跨 wasm-bindgen 边界从 JavaScript 接收对象并存储它们以供以后检索。这是我希望的简化版本:
static mut MAP: HashMap<i32, String> = HashMap::new();
#[wasm_bindgen]
pub fn add_value(index: i32, value: String) {
unsafe {
MAP.insert(index, value);
}
}
#[wasm_bindgen]
pub fn get_value(index: i32) -> String {
unsafe {
(*MAP.get(&index).unwrap()).clone()
}
}
Run Code Online (Sandbox Code Playgroud)
但是我从 Rust 编译器得到这个错误:
static mut MAP: HashMap<i32, String> = HashMap::new();
#[wasm_bindgen]
pub fn add_value(index: i32, value: String) {
unsafe {
MAP.insert(index, value);
}
}
#[wasm_bindgen]
pub fn get_value(index: i32) -> String {
unsafe {
(*MAP.get(&index).unwrap()).clone()
}
}
Run Code Online (Sandbox Code Playgroud)
如何存储状态,以便跨 wasm-bindgen …
是否可以让 wasm-bindgen 忽略(不生成绑定)impl 中的某些公共函数?我有一个 impl,我希望某些公共函数具有绑定,但其他公共函数我不需要绑定。