【发布时间】:2012-10-31 18:23:41
【问题描述】:
在我的应用程序中有一个场景,其中一个线程在其运行方法 while(true) 条件下执行此操作。
在其为真条件下,它不断地从外部数据源 (Memcache) 获取信息,根据新登录或注销的用户添加/删除其中的内容,最后将其更新回 Memcache。
一些代码片段
public class MonitoringThread extends Thread
{
public void run() {
while(true)
String response = Memcache.get("USERINFO");
// Some checks will be made on response and builds a new response and updates back to Memcache .
synchronized (response)
{
Memcache.set("USERINFO" , response) ;
}
}
}
我的问题是
我在 set 操作上保留了 Synchronized 块(这是否正确)或者应该在执行 get 操作时完成??
以及传递给 Synchronied 块的参数,应该是 this(类本身)还是 String 响应
更多信息。
我们的应用程序在由负载均衡器控制的 5 个 Web 服务器实例上运行。 (所有这 5 个实例都会返回操作和更新数据)
请分享你的想法。
感谢阅读,祝你有美好的一天。
编辑部分
感谢回复,
我已经更改了同步块参数,请在下面告诉我什么是可行的方法
选项 1
在线程中使用同步块
synchronized (Memcache.class)
{
Memcache.set("USERINFO" , response) ;
}
class Memcache
{
public static boolean set(String key, Object value) {
MemcacheClient.set(key, 0, value);
}
或者
在 Memcache 类本身中使用同步块
class Memcache
{
synchronized (Memcache.class)
{
public static boolean set(String key, Object value) {
MemcacheClient.set(key, 0, value);
}
// 其他方法 }
【问题讨论】:
-
你仍然没有解释为什么你首先想要一个同步块。
-
正如我所说的,有 5 个 Web 服务器实例,用户可能从 web 1、2、3、4 或 5 登录,并且在注销期间也是如此。所以我在内存缓存中维护用户登录信息
-
这并不能解释为什么需要同步块。你真的了解同步的作用吗?它与多个 Java 进程没有任何关系。您拥有 5 个 Web 服务器这一事实与线程同步无关。
-
你同意我试图解释的是,用户可能已登录或注销,我试图在 Memcache 中维护所有登录的用户信息。如果发生注销,更新 Mmecache 中的数据
-
这仍然不能解释为什么你需要一个同步块。您是否在某处读到过您的 memcache 客户端不是线程安全的并且需要外部同步?
标签: java multithreading thread-safety