1,Box
保证分配在堆上,只能有一个拥有所有权
let p1 = T{x:25};//栈上分配,出函数消失
let p1 = Box ::new T{x:25};
自动 *p
2,Rc
引用计数,单线程拥有多个所有权,只读
//分配在堆上,单线程,只读,引用计数(引用变成0,会把堆上的内容删除。计数本身不是原子性)
let p1 = Rc ::T{x:25};
let p2 = Rc ::clone(&p1);//克隆
let p3 = Rc ::clone(&p1);
不能多线程共享,不能安全传递
3,Arc
多线程拥有多个所有权,只读
原子性的引用计数,多线程共享读
let p1 = Arc ::T{x:25};
let p2 = Arc ::clone(&p1);//克隆
let h1 = thread::spawn(movw || {
println(" {} " , p2.x);
});
let p3 = Arc ::clone(&p1);
let h2 = thread::spawn(movw || {
println(" {} " , p3.x);
});
4,Mutex 互斥指针
保护数据(只能指针本身有锁保护数据,隐藏了),保证只有一个线程操作数据
java是锁代码,它是锁数据
可变不共享,执行时只有一个线程有所有权
Mutex 本身不能被传递
//单线程
let mut p1 = Mutex::T{x:0};
let mut p2 = p1.lock().unwrap();
p2.x +=1;
println(" {} " , p2.x);
let h1 = thread::spawn(movw || {
println(" {} " , p3.x);
});
let h2 = thread::spawn(movw || {
println(" {} " , p3.x);
});
5,如何保障数据安全修改
Arc(Mutex(data)) --> clone Mutex的所有权 - > 通过Mutex修改