2

因此,在处理存在锁定问题的事情时,我遇到了一个问题。只能从单个线程访问的对象是否需要锁或同步?

例如,给定 Thread1、Thread2 和 Thread3,以及 Buffer1、Buffer2、Buffer3,其中每个缓冲区在创建线程时被实例化,这意味着 Thread1 只会访问 Buffer1,对于 Thread2 和 Buffer2 以及 Thread3 也是如此和缓冲区 3。Thread1 永远不会触及 Buffer2 或 Buffer3。在流中添加/删除/修改字节时,是否需要锁?

4

6 回答 6

2

不,在这种情况下您不需要任何锁。只有在多个线程之间共享任何资源时才需要锁定和同步。

如果您继续在该缓冲区的私有实例上添加同步,那么它仍然不会有任何区别,因为不会有线程等待获取锁,唯一锁定和释放缓冲区的将是所有者线程。

于 2012-07-31T04:11:59.627 回答
1

只有当两个或更多线程需要访问共享对象时,您才需要担心锁定问题。

于 2012-07-31T04:02:57.720 回答
1

不会。这种确保线程安全的策略通常称为限制。

限制依赖于封装技术来确保多个线程不能访问一个对象。Doug Lea 的“Java 中的并发编程”一章很好地介绍了限制的细节及其与其他排除技术相比的优缺点。

套用 Lea 的话说,一般来说,在方法 m 中将引用 r 限制到对象 x 需要 4 个条件:

  1. m 不能将 r 作为参数传递给另一个方法。
  2. m 不能将 r 作为返回值传递。
  3. m 不能在可从另一个线程访问的字段(实例或静态)中记录 r。
  4. m 不能让任何其他可能被遍历到 r 的引用逃逸(通过 1-3)。
于 2012-07-31T04:06:45.357 回答
1

1.多个线程试图访问一个对象时,锁定就变得必要了。

2.此外,如果可以通过线程进行并发访问,则开发时的类需要是线程安全的。

3.一个类被称为线程安全的,如果它在底层操作系统的交错和调度存在下表现正确,而没有来自客户端的任何同步机制。

4. 锁定资源会导致开销,阻止并发访问和瓶颈情况。

于 2012-07-31T04:27:51.613 回答
0

根据我在学习中的记忆,如果您为每个线程使用私有缓冲区,则不必担心锁定它以避免并发访问,因为您没有任何线程。

如果除了创建者之外没有人在读取缓冲区,它可以在上面做他想做的任何事情,而不必担心其他人正在读取或写入它。所以你应该没事

但是你必须记住,一个线程可以随时被中断,所以你的内部缓冲区可能处于不一致的状态。(这应该不是问题,因为您只能从同一个线程按顺序访问)

于 2012-07-31T04:06:19.343 回答
0

除非线程同时使用相同的数据结构,否则不需要锁。

因此,如果每个线程使用不同的数据结构,则可以保证您的代码是线程安全的。

java.util.ArrayList顺便说一句,这就是关键的 Java 集合类(如不是线程安全的)的主要原因之一:使它们成为线程安全的会增加性能开销,如果不需要,则不必为此付出代价,而且在很多情况在某些情况下您不需要它,因为您可以通过其他方式确保一次只有一个线程访问 ArrayList。

于 2012-07-31T04:08:41.593 回答