同步块中的并发操作

时间:2012-10-31 18:23:41

标签: java multithreading thread-safety

在我的应用程序中有一个场景,其中一个线程在其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) ;
}
}
}

我的问题是

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

  2. 传递给Synchronied块的参数,无论是this(类本身)还是String响应

  3. 更多信息。

    我们的应用程序在由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);
    }
    

    //其他方法     }

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

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

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