多线程 - java 线程同步问题
PHP中文网
PHP中文网 2017-04-18 09:50:26
0
5
467

如下两个线程类:

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!!

PHP中文网
PHP中文网

认证高级PHP讲师

répondre à tous(5)
阿神
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()){
        
        }
        
        .......
    }
}
Ty80

Essayez synchronized, il se décline en plusieurs granularités.
Il peut être ajouté au bloc de code comme @scort, ou il peut être ajouté à l'objet.

PHPzhong

synchronisé ou ReentrantLock. Quelqu'un a déjà donné un exemple de synchronisé, je vais donner un exemple de ReentrantLock ici :

ReentrantLock lock = new ReentrantLock(); 
lock.lock();  
try {  
    // 这里是对sb的操作  
} finally {  
    lock.unlock();  
} 
Ty80

Pour le moment, vous pouvez envisager d'utiliser StringBuffer directement. La seule différence avec StringBuilder est que le premier est thread-safe.

大家讲道理

Personnellement, je pense que vous devriez d'abord proposer la méthode qui nécessite l'exécution d'un thread, puis ajouter un verrou à la méthode, puis supprimer plusieurs threads et cela devrait être possible

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal