Java 防止多个线程同时使用多个方法

Java 防止多个线程同时使用多个方法,java,multithreading,thread-safety,synchronized,Java,Multithreading,Thread Safety,Synchronized,我正在为聊天室编写一个服务器,出现以下问题。 我有添加、删除和操纵用户的方法。它看起来是这样的: 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(

我正在为聊天室编写一个服务器,出现以下问题。 我有添加、删除和操纵用户的方法。它看起来是这样的:

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;
}
User[]users=新用户[8];
公共同步的void addUser(用户u){
对于(int i=0;i<8;i++)
if(用户[i]==null)
用户[i]=u;
}
公共同步无效广播(字符串s){
for(用户u:用户)
u、 发送消息;
}
公共同步的void removeUser(个用户){
对于(int i=0;i<8;i++)
如果(用户[i]==s)
用户[i]=null;
}
我不确定这是否足够。我想让这根线安全。例如:
我有线程A和线程B,它们都有访问这些方法的权限。当线程A调用广播方法时,线程B应该不能使用这些方法中的任何一种。把同步修改器放在那里就足够了吗?我知道使用它时应该小心,因为线程必须等待,这会减慢程序的速度,但我的程序足够小,速度并不重要。

如果所有三个方法都属于同一类,并且所有线程都具有该类的相同实例,
synchronized
足以确保在任何时间都只能执行这三种方法中的一种。如果另一个线程在执行某个线程时尝试运行这三个方法中的一个,则第二个线程将自动等待该方法完成。

代码仅在特定实例上同步。这将只允许单个线程在特定时间对其实例调用该方法。i、 每个线程每个方法每个实例在任何时间点。回答你的问题,

当线程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()

是的,它们都是同一个类的一部分,我只制作了一个对象。所以它们是安全的?八达通说这只对一个函数有效(A调用broadcast(),但B可以调用addUser()。我希望当A调用broadcast()时,B不能执行这些函数中的任何一个。谁说得对?@Genuigr
synchronized
是每个实例,而不是每个实例+方法。请看,第一个要点是“使这些方法同步有两个效果:”章节。我认为第二段是不正确的,你可以考虑修改。it@Marco13我修改了它。我想我现在说对了。