是否有用于创建没有同步和锁的线程的用例?

2 java multithreading synchronization

由于线程执行发生在池中,并且不能保证以任何特定顺序排队,那么为什么要在没有同步和锁保护的情况下创建线程?为了保护附加到对象状态的数据(我理解为使用线程的主要目的),锁定似乎是唯一的选择.如果你不同步,最终你会遇到竞争条件和"损坏的"数据.因此,如果您对保护该数据不感兴趣,那么为什么要使用线程呢?

duf*_*ymo 10

如果没有共享的可变数据,则不需要同步或锁定.


Jas*_*n S 9

代表团,就像一个例子.考虑一个获取连接请求的Web服务器.它可以将特定请求委托给工作线程.主线程可以将所需的所有数据传递给工作线程,只要该数据是不可变的,并且不必担心并发数据访问.

(就此而言,主线程和工作线程都可以将所有不可变数据发送到他们想要的彼此,它只需要某种类型的消息传递队列,因此队列可能需要同步而不是数据本身.但是你不需要需要一个消息队列来获取工作线程的数据,只需在线程启动之前构造数据,并且只要数据在该点不可变,就不需要任何同步或锁定或任何类型的并发管理,其他而不是运行线程的能力.)


Jim*_*ans 6

同步和锁保护共享状态免受冲突的并发更新.如果没有要保护的共享状态,则可以在不锁定和同步的情况下运行多个线程.这可能是Web服务器中具有多个独立工作线程来处理传入请求的情况.避免同步和锁定的另一种方法是让你的线程只在不可变的共享状态下运行:如果一个线程不能改变另一个线程正在运行的任何数据,那么并发的非同步访问就可以了.

或者您可能正在使用基于Actor的系统来处理并发.参与者只通过消息传递进行通信,没有共享状态让他们担心.所以在这里你可以让很多线程运行很多没有锁的Actors. Erlang使用这种方法,并且有一个Scala Actors库,允许您在JVM上以这种方式编程.此外,还有基于Actors的Java库.