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我修改了它。我想我现在说对了。