在我的应用程序中有一个场景,其中一个线程在其run方法下,而(true)条件执行此操作。
在其真实状态下,它会从外部数据源(Memcache)继续获取信息,根据新登录或注销的用户添加/删除内容,最后将其更新回Memcache。
一些Snipet代码
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) ;
}
}
}
我的问题是
我在设置操作中保留了一个Synchronized块(这是正确的)还是应该在执行get操作时完成?
传递给Synchronied块的参数,无论是this(类本身)还是String响应
更多信息。
我们的应用程序在由Load Balancer控制的5个Web Server实例上运行。 (所有这5个实例都会执行操作和更新数据)
请分享您的想法。
感谢阅读,祝你有个美好的一天。
已编辑的部分
感谢您的回复,
我已经更改了synchronized块参数,请告诉我下面的什么是fesable appproach
选项1
在线程中使用同步块
synchronized (Memcache.class)
{
Memcache.set("USERINFO" , response) ;
}
class Memcache
{
public static boolean set(String key, Object value) {
MemcacheClient.set(key, 0, value);
}
或
在Memcache类本身中使用Synchronied块
class Memcache
{
synchronized (Memcache.class)
{
public static boolean set(String key, Object value) {
MemcacheClient.set(key, 0, value);
}
//其他方法 }
答案 0 :(得分:2)
锁定字符串不太可能有用,因为每次都锁定不同的对象。 Memcache
应执行所需的任何锁定,如果不是,则需要锁定同一对象,例如Memcache.class
答案 1 :(得分:1)
我不知道你要对这个同步块做什么,以及为什么你需要首先进行同步。要使用synchronized块保护的共享状态是什么?
无论如何,这个片段没有多大意义。 synchronized(response)
表示如果两个线程都从缓存中接收到相同的String实例(相同的对象,而不仅仅是相同的字符),则它们将无法执行synchronized块。这是不太可能的,可能不是你想要的。