Java中的线程安全

Java中的线程安全,java,multithreading,thread-safety,Java,Multithreading,Thread Safety,所以,当我在做一些有锁定问题的事情时,我遇到了一个问题。只能从单个线程访问的对象是否需要锁或同步 例如,给定Thread1、Thread2和Thread3以及Buffer1、Buffer2和Buffer3,其中每个缓冲区都是在创建线程时实例化的,这意味着Thread1将只访问Buffer1,Thread2和Buffer2以及Thread3和Buffer3也是如此。螺纹1永远不会接触缓冲区2或缓冲区3。在流中添加/删除/修改字节时,是否需要锁定?只有当两个或多个线程需要访问共享对象时,您才需要担心

所以,当我在做一些有锁定问题的事情时,我遇到了一个问题。只能从单个线程访问的对象是否需要锁或同步


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

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

根据我的研究,如果您为每个线程使用私有缓冲区,则不必担心锁定它以避免并发访问,因为你没有

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


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

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

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

根据Lea的解释,在方法m中,将参考r限制在对象x上通常需要4个条件:

  • m不能将r作为参数传递给另一个方法
  • m不能将r作为返回值传递
  • m不能在可以从另一个线程访问的字段(实例或静态)中记录r
  • m不能让任何其他可能被遍历到r的引用(通过1-3)逃逸

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

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


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

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


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

    1。多个线程尝试访问对象时,然后需要锁定。

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

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


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

    +1对于思想挑战者:D-我的答案是否定的。同步(据我所知)确保一次只能有一个线程访问共享资源。正如你所描述的,那么不……好吧。这就是我所想的,但是由于我正在处理的对象是程序的核心,我想完全肯定我可以不锁定或同步。