因此,在处理存在锁定问题的事情时,我遇到了一个问题。只能从单个线程访问的对象是否需要锁或同步?
例如,给定 Thread1、Thread2 和 Thread3,以及 Buffer1、Buffer2、Buffer3,其中每个缓冲区在创建线程时被实例化,这意味着 Thread1 只会访问 Buffer1,对于 Thread2 和 Buffer2 以及 Thread3 也是如此和缓冲区 3。Thread1 永远不会触及 Buffer2 或 Buffer3。在流中添加/删除/修改字节时,是否需要锁?
因此,在处理存在锁定问题的事情时,我遇到了一个问题。只能从单个线程访问的对象是否需要锁或同步?
例如,给定 Thread1、Thread2 和 Thread3,以及 Buffer1、Buffer2、Buffer3,其中每个缓冲区在创建线程时被实例化,这意味着 Thread1 只会访问 Buffer1,对于 Thread2 和 Buffer2 以及 Thread3 也是如此和缓冲区 3。Thread1 永远不会触及 Buffer2 或 Buffer3。在流中添加/删除/修改字节时,是否需要锁?
不,在这种情况下您不需要任何锁。只有在多个线程之间共享任何资源时才需要锁定和同步。
如果您继续在该缓冲区的私有实例上添加同步,那么它仍然不会有任何区别,因为不会有线程等待获取锁,唯一锁定和释放缓冲区的将是所有者线程。
只有当两个或更多线程需要访问共享对象时,您才需要担心锁定问题。
不会。这种确保线程安全的策略通常称为限制。
限制依赖于封装技术来确保多个线程不能访问一个对象。Doug Lea 的“Java 中的并发编程”一章很好地介绍了限制的细节及其与其他排除技术相比的优缺点。
套用 Lea 的话说,一般来说,在方法 m 中将引用 r 限制到对象 x 需要 4 个条件:
1.当多个线程试图访问一个对象时,锁定就变得必要了。
2.此外,如果可以通过线程进行并发访问,则开发时的类需要是线程安全的。
3.一个类被称为线程安全的,如果它在底层操作系统的交错和调度存在下表现正确,而没有来自客户端的任何同步机制。
4. 锁定资源会导致开销,阻止并发访问和瓶颈情况。
根据我在学习中的记忆,如果您为每个线程使用私有缓冲区,则不必担心锁定它以避免并发访问,因为您没有任何线程。
如果除了创建者之外没有人在读取缓冲区,它可以在上面做他想做的任何事情,而不必担心其他人正在读取或写入它。所以你应该没事
但是你必须记住,一个线程可以随时被中断,所以你的内部缓冲区可能处于不一致的状态。(这应该不是问题,因为您只能从同一个线程按顺序访问)
除非线程同时使用相同的数据结构,否则不需要锁。
因此,如果每个线程使用不同的数据结构,则可以保证您的代码是线程安全的。
java.util.ArrayList
顺便说一句,这就是关键的 Java 集合类(如不是线程安全的)的主要原因之一:使它们成为线程安全的会增加性能开销,如果不需要,则不必为此付出代价,而且在很多情况下在某些情况下您不需要它,因为您可以通过其他方式确保一次只有一个线程访问 ArrayList。