rust 智能指针

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修改

你可能感兴趣的:(rust,rust,开发语言,后端)