如何使循环队列完全线程安全

时间:2017-10-20 12:59:34

标签: java concurrency thread-safety synchronized java-threads

在我刚刚添加同步到大多数方法的那一刻,因为看起来没有它,这些方法不是线程安全的。还有什么我需要实现以确保它是线程安全的。

此外,还有更好的方法来解决这个问题。在一分钟内,只有一个线程可以同时使用循环队列,这似乎有点低效。

init: function( pThis ) {
  toolbarActiveItem:  'test',
        this.state = {
        toolbar: [
                {
                  id: 5,
                  name: 'test',
                  description: I18n.t('test'), 
                  if(this.item=='A'){
                     isTouchable: false,
                    }
                  else {
                        isTouchable: true,
                       }
                  onOpen: (item) => { this.onToolbarOpen(pThis,item) },
                  },
               ],
        };

        this.onToolbarOpen(pThis);
    },

您可以给予任何建议或帮助!

2 个答案:

答案 0 :(得分:1)

除了缺少使empty()方法同步之外,您的迭代器还没有与主机队列充分隔离。问题不在于它的方法在迭代器实例上是同步的,尽管它们确实如此。您的迭代器正在复制主机队列的数据,以便迭代队列的快照。这是一个好主意,在这种情况下,在迭代器本身上进行同步是正确的。

但是你没有完全实现它。具体来说,构造函数执行d = dd;是不够的。数组是对象,因此只需设置迭代器的数组引用即可引用主机队列使用的相同数组对象。相反,您需要复制该数组。有几种方法可以这样做,但我更愿意调用数组的clone()方法 - 简短而且甜蜜。

即使这样,也存在线程安全问题,即单独的类方法的同步无法防御。其中一些涉及对象在多个方法调用中的一致性。例如,假设一个线程将队列实例上的对象排入队列。如果该队列在线程之间共享,那么排队该对象的队列就不能安全地假设它可以在以后使某个对象出列,或者如果它确实使一个对象出列,那么它将与它排队的那个队列相同。如果它希望能够做出这样的假设,那么它必须提供更广泛的范围保护,或者确保它所使用的队列实例不被共享。

其他问题围绕着入队对象的变异,如果它们确实是可变的。它们的状态不受队列及其迭代器同步的保护。

答案 1 :(得分:0)

empty()未同步,迭代器方法上的synchronized保护迭代器(可能没用),但不保护队列本身。