确保按顺序采用Java同步锁?

我们有两个线程通过synchronized方法访问一个列表。 我们可以吗

a)依靠运行时间来确保每个人都可以根据他们尝试的顺序或方式接收方法

b)VM是否遵循任何其他规则

c)是否有更好的方法来序列化请求?

不,synchronized将以任何顺序提供访问权限(取决于JVM实现)。 这甚至可能导致Threads在某些情况下挨饿。

您可以使用ReentrantLock (自Java 5.0起)使用fair=true选项来确保订单。 ( Lock lock = new ReentrantLock(true);

不,你不能确定按顺序发生两次对同步方法的调用。 订单未指定且依赖于实现。

这在JLS的17.1 Locks部分中定义。 请注意,没有说明等待锁的线程应该获得访问权的顺序。

您不能依赖于从每个线程调用特定方法的顺序。 如果只有两个线程可能是肯定的。 但想象一下,如果有3个线程和1个线程已经获得访问权限。 当他们尝试访问时,其他2个线程将等待,并且其中任何一个都可以获得访问权限,这不取决于他们调用此方法的顺序。 因此,不建议依赖订单。

c)是否有更好的方法来序列化请求?

您是否有机会将列表用作队列,即使用模式是否看起来像这样?

而(某些条件){
    同步(的thelist){
         anItem =从列表中获取和删除元素
     }
    用anItem做一些工作
 }

如果是这样,您可能需要查看BlockingQueue接口而不是使用自己的锁定方案。 实现(如ArrayBlockingQueue )具有公平性等设置。

我总是将同步留给app服务器或引擎,除非定义自己的强度

是。

如果通过一个同步方法访问列表,则将序列化来自多个线程的并发请求。