【问题标题】:Concurrent operation in a synchronized block同步块中的并发操作
【发布时间】: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) ;
}
}
}

我的问题是

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

// 其他方法 }

【问题讨论】:

  • 你仍然没有解释为什么你首先想要一个同步块。
  • 正如我所说的,有 5 个 Web 服务器实例,用户可能从 web 1、2、3、4 或 5 登录,并且在注销期间也是如此。所以我在内存缓存中维护用户登录信息
  • 这并不能解释为什么需要同步块。你真的了解同步的作用吗?它与多个 Java 进程没有任何关系。您拥有 5 个 Web 服务器这一事实与线程同步无关。
  • 你同意我试图解释的是,用户可能已登录或注销,我试图在 Memcache 中维护所有登录的用户信息。如果发生注销,更新 Mmecache 中的数据
  • 这仍然不能解释为什么你需要一个同步块。您是否在某处读到过您的 memcache 客户端不是线程安全的并且需要外部同步?

标签: java multithreading thread-safety


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-08-07
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 2019-04-17
      • 1970-01-01
      • 2020-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多