java 同步块 - 锁定整个方法
java synchronized block - locking the whole method
我不太确定如何正确使用同步块。我知道使用synchronized关键字会锁住整个class。所以这不是我想要的。我想锁定 class 中的单个方法。这是我的 class 中的示例。
//class does only contain static methods
public class MessageFactory implements IValues {
public static Message createRegisterRequest(String name, String password) {
Payload payload = createPayload(name, password);
return new Message(VALUE_REGISTRATION, payload);
}
}
如何正确使用同步块来锁定整个方法?我可以选择任何参数(或名称或密码)吗?有什么区别吗:
public static Message createRegisterRequest(String name, String password) {
synchronized(name){
Payload payload = createPayload(name, password);
return new Message(VALUE_REGISTRATION, payload);
}
}
和:
public static Message createRegisterRequest(String name, String password) {
synchronized(password){
Payload payload = createPayload(name, password);
return new Message(VALUE_REGISTRATION, payload);
}
}
和:
public static Message createRegisterRequest(String name, String password) {
Object lock = new Object();
synchronized(lock){
Payload payload = createPayload(name, password);
return new Message(VALUE_REGISTRATION, payload);
}
}
createPayload 未访问任何共享内容。
看起来像:
private static Payload createPayload(int playerID, String roomName){
Payload payload = new Payload();
payload.setPlayerID(playerID);
payload.setRoomName(roomName);
return payload;
}
我认为我必须同步方法,因为有多个实例同时访问 MessageFactory 中的方法。如果我错了请告诉我。
Java 中的同步是使用 shared 对象进行的。因此,您应该 在 方法之外进行同步。任何局部变量或参数都不起作用,因为该数据对于每个方法调用都是局部的并且不共享。
你应该这样做:
public class MessageFactory implements IValues {
private static final Object LOCK = new Object();
public static Message createRegisterRequest(String name, String password) {
synchronized(LOCK){
Payload payload = createPayload(name, password);
return new Message(VALUE_REGISTRATION, payload);
}
}
}
我不太确定如何正确使用同步块。我知道使用synchronized关键字会锁住整个class。所以这不是我想要的。我想锁定 class 中的单个方法。这是我的 class 中的示例。
//class does only contain static methods
public class MessageFactory implements IValues {
public static Message createRegisterRequest(String name, String password) {
Payload payload = createPayload(name, password);
return new Message(VALUE_REGISTRATION, payload);
}
}
如何正确使用同步块来锁定整个方法?我可以选择任何参数(或名称或密码)吗?有什么区别吗:
public static Message createRegisterRequest(String name, String password) {
synchronized(name){
Payload payload = createPayload(name, password);
return new Message(VALUE_REGISTRATION, payload);
}
}
和:
public static Message createRegisterRequest(String name, String password) {
synchronized(password){
Payload payload = createPayload(name, password);
return new Message(VALUE_REGISTRATION, payload);
}
}
和:
public static Message createRegisterRequest(String name, String password) {
Object lock = new Object();
synchronized(lock){
Payload payload = createPayload(name, password);
return new Message(VALUE_REGISTRATION, payload);
}
}
createPayload 未访问任何共享内容。 看起来像:
private static Payload createPayload(int playerID, String roomName){
Payload payload = new Payload();
payload.setPlayerID(playerID);
payload.setRoomName(roomName);
return payload;
}
我认为我必须同步方法,因为有多个实例同时访问 MessageFactory 中的方法。如果我错了请告诉我。
Java 中的同步是使用 shared 对象进行的。因此,您应该 在 方法之外进行同步。任何局部变量或参数都不起作用,因为该数据对于每个方法调用都是局部的并且不共享。
你应该这样做:
public class MessageFactory implements IValues {
private static final Object LOCK = new Object();
public static Message createRegisterRequest(String name, String password) {
synchronized(LOCK){
Payload payload = createPayload(name, password);
return new Message(VALUE_REGISTRATION, payload);
}
}
}