Java 并发线程和共享对象死锁

Java 并发线程和共享对象死锁,java,multithreading,concurrency,Java,Multithreading,Concurrency,我发现这个问题很简单,我甚至不需要帮助。只花了一会儿。方法上的synchronized关键字锁定整个对象,而不是所需的一小部分代码。这意味着nextTask和getTask会导致彼此阻塞 最好在内部使用ConcurrentLinkedQueue或堆栈。另外,您是否打算跳过数组的第一个元素?数组索引从0开始。我不使用数组。我只是使用私有字段和同步方法来完成一切。当第一个线程获得要处理的第一个值时,它调用getTask(),这将为它提供值1,因为这是起始值。然后将索引增加为2,这样一旦释放锁,第二个

我发现这个问题很简单,我甚至不需要帮助。只花了一会儿。

方法上的
synchronized
关键字锁定整个对象,而不是所需的一小部分代码。这意味着
nextTask
getTask
会导致彼此阻塞


最好在内部使用
ConcurrentLinkedQueue
或堆栈。另外,您是否打算跳过数组的第一个元素?数组索引从0开始。

我不使用数组。我只是使用私有字段和同步方法来完成一切。当第一个线程获得要处理的第一个值时,它调用getTask(),这将为它提供值1,因为这是起始值。然后将索引增加为2,这样一旦释放锁,第二个线程将从getTask()获得2,然后将索引更改为3。nextTask()未被使用。您将注意到它已被合并到getTask()中;nextTask()和getTask()都很简单。那么,如果它们导致彼此阻塞呢?在这两个例程中花费的时间都是亚微秒级的。@user2355058,当你请求帮助时,礼貌的做法是发布演示你的问题的最小示例。包括未调用的方法是非常不礼貌的。由于Model.tasks和Model.taskIndex总是一起递减/递增,因此可以将其中一个作为另一个的函数来计算。这样做的好处是,您可以使用
AtomicInteger
而不是
synchronized
块来执行递增/递减操作。如果您只做了一百次,这不会对性能产生任何显著影响,但这仍然是一个好习惯。实例变量Model.value似乎没有任何作用。为什么不在Model.getTask()中使用局部变量呢?