簡體   English   中英

防止多個線程同時使用多個方法

[英]Preventing usage of multiple methods by several threads simultaneously

我正在為聊天室編寫服務器並遇到以下問題。 我有添加,刪除和操作用戶的方法。 簡化它看起來像這樣:

User[] users = new User[8];

public synchronized void addUser(User u) {
    for (int i = 0; i < 8; i++)
        if (users[i] == null)
            users[i] = u;
}

public synchronized void broadcast(String s) {
    for (User u: users)
        u.sendMessage(s);
}

public synchronized void removeUser(User s) {
    for (int i = 0; i < 8; i++)
        if (users[i] == s)
            users[i] = null;
}

我不確定這是否足夠。 我想讓這個線程安全。 一個例子:我有線程A和B,都可以訪問這些方法。 當線程A調用廣播方法時,線程B不應該使用任何這些方法。 是否足以將同步修飾符放在那里? 我知道在使用它時應該小心,因為它會減慢程序,因為線程必須等待,但我的程序足夠小,速度並不重要。

如果所有三個方法都屬於同一個類,並且所有線程都具有該類的相同實例 ,則synchronized足以確保這三個方法中只有一個可以在任何時刻執行。 如果另一個線程在線程執行時嘗試運行這三個方法中的一個,則該第二個線程將自動等待該方法完成。

代碼僅在特定實例上同步。 這將只允許一個線程在特定時間內在其實例上調用該方法。 即在任何時間點每個實例的每個方法的每個線程。 要回答你的問題,

當線程A調用廣播方法時,線程B不應該使用任何這些方法。 是否足以將同步修飾符放在那里?

是的,代碼足夠安全,它不允許線程B同時調用實例上的任何方法,直到線程A釋放鎖定為止

除了之前的答案,對於線程不安全的操作,您可以使用鎖。 這是一個簡單的例子:

import threading

theLock = threading.Lock()

def foo():
    global theLock

    #acquire the lock, thread will wait until no other thread has the lock
    theLock.acquire()

    #do something
    bar()   

    #release lock so that other threads may acquire it, if other thread is waiting for lock it may be launched immediately
    theLock.release()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM