java - 理解同步和实现队列

标签 java oop synchronization queue synchronized

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

我阅读和理解 synchronized 的方式是,在我分离出的所有线程中,一次只能有一个线程处于以下任何一种方法中。例如,如果用户尝试在一个线程中发布照片,然后立即在另一个线程中获取数据,则获取数据线程必须等到发布照片线程完成后才能开始获取数据。由于我所有的 Web 请求都通过此类并且所有方法都是同步的,这意味着它们基本上已经排队了,对吗?

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 的一部分。

最佳答案

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

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

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

关于java - 理解同步和实现队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8562323/

相关文章:

java - 使用 FlowLayout 的面板不能包含 JScrollPanes?

.NET "Global"变量;哪一个是更好的做法?

java - 房间同步 : How to ensure multiple threads are using same node?

c - CPU乱序影响测试程序

Java XOM 规范化 - 虚假字符

java - 线程中的异常

c++ - 析构函数如何执行?

java - 在 Java 中正确同步 equals()

java - 是否可以编写AOP注解?

JAVA OOP继承树