Rumah > Soal Jawab > teks badan
如下两个线程类:
public class A implements Runnable{
private StringBuilder sb;
@Override
public void run() {
//操作sb缓冲
.......
}
public StringBuilder getsb() {
return sb;
}
public void setsb(StringBuilder sb) {
this.sb = sb;
}
}
public class B implements Runnable{
//此处得到A类的对象a
@Override
public void run() {
//操作a.getsb()缓冲
.......
}
}
如何能保证,A、B互斥?
A的线程在操作sb的时候加锁,让B不能操作;或者B的线程在操作sb的时候加锁,让A不能操作
始终只有一个线程可以操作sb!!
阿神2017-04-18 09:52:26
public class A implements Runnable{
private StringBuilder sb;
@Override
public void run() {
//操作sb缓冲
synchronized(sb){
}
.......
}
public StringBuilder getsb() {
return sb;
}
public void setsb(StringBuilder sb) {
this.sb = sb;
}
}
public class B implements Runnable{
//此处得到A类的对象a
@Override
public void run() {
//操作a.getsb()缓冲
synchronized(a.getsb()){
}
.......
}
}
PHP中文网2017-04-18 09:52:26
Cuba synchronized
, ia datang dalam beberapa butiran.
Ia boleh ditambahkan pada blok kod seperti @scort, atau ia boleh ditambahkan pada objek.
PHPz2017-04-18 09:52:26
synchronized atau ReentrantLock Seseorang memberi contoh synchronized sebelum ini saya akan berikan contoh ReentrantLock di sini:
ReentrantLock lock = new ReentrantLock();
lock.lock();
try {
// 这里是对sb的操作
} finally {
lock.unlock();
}
PHP中文网2017-04-18 09:52:26
Pada masa ini, anda boleh mempertimbangkan untuk menggunakan StringBuffer secara langsung Satu-satunya perbezaan daripada StringBuilder ialah yang pertama adalah selamat untuk benang.
大家讲道理2017-04-18 09:52:26
Saya secara peribadi berpendapat anda harus mengemukakan kaedah yang memerlukan pelaksanaan utas dahulu, kemudian tambahkan kunci pada kaedah itu, dan kemudian alih keluar berbilang utas dan ia sepatutnya boleh dilakukan