1

在我的应用程序中有一个场景,其中一个线程在其运行方法 while(true) 条件下执行此操作。

在其 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) ;
}
}
}

我的问题是

  1. 我在 set 操作中保留了 Synchronized 块(这是正确的)还是应该在执行 get 操作时完成?

  2. 以及传递给 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);
}

// 其他方法 }

4

2 回答 2

2

锁定字符串不太可能有用,因为您每次都锁定不同的对象。 Memcache应该执行它需要的任何锁定,如果不需要,你需要锁定同一个对象,例如Memcache.class

于 2012-10-31T18:29:48.487 回答
1

我不知道你想用这个同步块做什么,以及为什么你首先需要同步。您想使用同步块保护的共享状态是什么?

无论如何,可以肯定的是这个片段没有多大意义。synchronized(response)意味着如果两个线程都从缓存中接收到相同的 String 实例(相同的对象,而不仅仅是相同的字符),它们将无法执行同步块。这不太可能,并且可能不是您想要的。

于 2012-10-31T18:32:08.820 回答