【问题标题】:Understanding synchronized and implementing a queue了解同步和实现队列
【发布时间】:2012-01-23 15:24:15
【问题描述】:

我从正在开发的 Android 应用程序发出多个 Web 请求。我希望按照它们到达的顺序一次处理所有这些请求,我的下面的代码可以做到吗?

我阅读和理解同步的方式是在我衍生的所有线程中,一次只能有一个可以在以下任何一种方法中。例如,如果用户尝试在一个线程中发布照片,然后立即在另一个线程中获取数据,那么 getData 线程将不得不等到 postPhoto 线程完成后才能开始获取数据。由于我所有的网络请求都通过这个类并且所有的方法都是同步的,这意味着它们基本上排队正确吗?

public class Controller {

public synchronized static String getData(String url, String limit) { ... }

public synchronized static String postPhoto(String filepath, int server_id) { ... }

public synchronized static InputStream getPhoto(String thumbnailPath) { ... }

public synchronized static String createIncident(String name, String description) { ... }

public synchronized static String updatePerson() { ... }

synchronized static boolean verifyConnection(String response) { ... }
}

编辑:
我可能应该提到,即使上面的一些方法被称为 createIncident 或 updatePerson,它们都只发出 httprequests,所有方法中的代码通常都是相同的,除了重要的微小变化。在我的代码的其他部分,我分拆线程来调用这些方法,这就是我要询问的部分。由于这些线程调用这些方法,调用 getData 的线程 B 将不得不等到线程 A 完成它是 postPhoto 的一部分。

【问题讨论】:

  • 大多数队列背后的想法是允许生产者和消费者同时工作。在这种情况下,您将序列化您的请求,但是当“消费者”忙碌时,您的“生产者”将阻塞。
  • 只是为了澄清@Peter 所说的:您的代码基本上不是多线程的,这可能不是您想要的。它当然是安全同步的,但如此之多,以至于您只能在多核硬件上获得与单核相对应的性能。
  • 我要澄清一下。我想我在原始问题中遗漏了一些重要信息
  • 阅读您的编辑后,您的过度同步似乎比我想象的还要严重。当一个方法发出一个 httprequest 时,它会持有 Controller.class 的锁,因此在您等待回复时没有其他方法可以运行......这可能会很长时间。

标签: java oop synchronization queue synchronized


【解决方案1】:

这也取决于您的实施。 您的控制器是单例还是每个线程的实例? 你的方法使用共享对象吗?

如果单例和方法共享对象,则不能保证 thread1 运行 postPhoto,然后立即运行 getData,即使您按顺序调用也是如此。另一个线程可能会在调用这 2 个方法的线程 1 之间轮流运行。

请记住,同步关键字锁在类本身上,因此在任何时候都只会执行一个方法。不会同时运行 2 个同步方法。

【讨论】:

  • 所有方法都是静态的,所以如果是单例也没关系。
  • 是的,我们看到的部分都是静态的,但也可能有一些实例方法,我们看不到整个代码。
  • 是的,它不是单例,所有方法都是静态的。你答案的最后一部分是我认为我需要的。由于它们是静态的,并且是类上的同步锁,因此在任何时候都只会执行一个方法。我知道命令不会被执行,但我可以接受。只要一次一个
  • 如果这就是您要找的东西,那就太好了。我想也许你在课堂上还有一些其他方法也不是静态的。
  • @Josh 顺便说一下,因为你只有静态方法,你应该没有构造函数 (private Controller() { }) 并且总是调用Controller.someStaticMethod()。我个人认为他们不应该允许在 Java 或任何语言的实例 (constroller1.someStaticMethod();) 上调用静态方法。
【解决方案2】:

是的,你是对的。 synchronizedstatic 的组合保证了您想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多