StringBuffer 还是同步方法?
StringBuffer or synchronized method?
我有以下代码:
public class MyLogger {
private StringBuilder logger = new StringBuilder();
public void log(String message, String user) {
logger.append(message);
logger.append(user);
}
}
程序员必须保证单个 MyLogger 对象可以正常工作
多线程系统。
必须如何将此代码更改为线程安全的?
一个。同步日志方法
乙。将 StringBuilder
替换为 StringBuffer
请告知最佳方法。
StringBuffer
不足以保证两条信息总是分组发送:
logger.append(message);
logger.append(user);
它仅保证 append()
不会以并发方式调用,因此您不会冒险破坏 StringBuffer
对象的状态。
您确实可以有两个线程在 log()
调用期间交错并获得这些调用:
Thread 1 : logger.append(message);
Thread 2 : logger.append(message);
Thread 1 : logger.append(user);
Thread 2 : logger.append(user);
这样更好:
public synchronized void log(String message, String user) {
logger.append(message);
logger.append(user);
}
您也可以在私有 logger
对象上进行同步。
其优点是不允许 class 的客户端将其锁定在 class.
之外
使用 A,因为如果您选择使用 StringBuffer,您可能会弄乱日志:
StringBuffer 可能会发生这种情况(将生成错误的日志):
logger.append(message); < Thread A
logger.append(message); < Thread B
logger.append(user); < Thread A
logger.append(user); < Thread B
我有以下代码:
public class MyLogger {
private StringBuilder logger = new StringBuilder();
public void log(String message, String user) {
logger.append(message);
logger.append(user);
}
}
程序员必须保证单个 MyLogger 对象可以正常工作 多线程系统。 必须如何将此代码更改为线程安全的?
一个。同步日志方法
乙。将 StringBuilder
替换为 StringBuffer
请告知最佳方法。
StringBuffer
不足以保证两条信息总是分组发送:
logger.append(message);
logger.append(user);
它仅保证 append()
不会以并发方式调用,因此您不会冒险破坏 StringBuffer
对象的状态。
您确实可以有两个线程在 log()
调用期间交错并获得这些调用:
Thread 1 : logger.append(message);
Thread 2 : logger.append(message);
Thread 1 : logger.append(user);
Thread 2 : logger.append(user);
这样更好:
public synchronized void log(String message, String user) {
logger.append(message);
logger.append(user);
}
您也可以在私有 logger
对象上进行同步。
其优点是不允许 class 的客户端将其锁定在 class.
使用 A,因为如果您选择使用 StringBuffer,您可能会弄乱日志: StringBuffer 可能会发生这种情况(将生成错误的日志):
logger.append(message); < Thread A
logger.append(message); < Thread B
logger.append(user); < Thread A
logger.append(user); < Thread B