gpt4 book ai didi

java - Java中的线程安全

转载 作者:行者123 更新时间:2023-11-29 08:17:02 26 4
gpt4 key购买 nike

全部,

我在过去几天开始学习 Java 线程,只读到一些场景,即使在使用同步器方法/ block 之后,代码/类仍然容易受到并发问题的影响。谁能提供同步块(synchronized block)/方法失败的场景?并且,在这些情况下应该采用什么替代方法来确保线程安全。

最佳答案

并发访问下的正确行为是一个复杂的话题,它并不像对所有内容都使用 synchronized 那样简单,因为现在您必须考虑操作如何交错。

例如,假设您有一个类似于列表的类,并且您想让它成为线程安全的。因此,您使所有方法同步并继续。很有可能,客户可能会通过以下方式使用您的列表:

int index = ...; // this gets set somewhere, maybe passed in as an argument

// Check that the list has enough elements for this call to make sense
if (list.size() > index)
{
return list.get(index);
}
else
{
return DEFAULT_VALUE;
}

在单线程环境中,这段代码是绝对安全的。但是,如果同时访问(并可能修改)列表,则列表的大小有可能在调用 size() 之后发生变化,但在之前get() 的调用。因此,在这种情况下,列表可能“不可能”抛出 IndexOutOfBoundsException(或类似异常),即使事先检查了大小。

解决这个问题没有捷径可走——您只需要仔细考虑您的类/接口(interface)的用例,并确保在与任何其他有效操作交错时确实可以保证它们。通常这可能需要一些额外的复杂性,或者只是在文档中更具体。如果假设的列表类指定它始终在自己的监视器上同步,那么特定情况可以固定为

synchronized(list)
{
if (list.size() > index)
{
return list.get(index);
}
}

但在其他同步方案下,这是行不通的。或者它可能是太多的瓶颈。或者强制客户端在同一词法范围内进行多次调用可能是 Not Acceptable 约束。这完全取决于您要实现的目标,以及如何使您的界面安全、高效和优雅。

关于java - Java中的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3891454/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com