Java 非多线程;它意味着每个线程有一个池。因为它是线程私有的,所以它不需要与其他线程同步以从它自己的池中选择对象。@Javier@John V:如果它是线程本地的,那么它可能是线程不安全的,所以我猜不需要并发特定算法(因为普通的旧编程很好),所以我看不出这本书的

Java 非多线程;它意味着每个线程有一个池。因为它是线程私有的,所以它不需要与其他线程同步以从它自己的池中选择对象。@Javier@John V:如果它是线程本地的,那么它可能是线程不安全的,所以我猜不需要并发特定算法(因为普通的旧编程很好),所以我看不出这本书的,java,concurrency,Java,Concurrency,非多线程;它意味着每个线程有一个池。因为它是线程私有的,所以它不需要与其他线程同步以从它自己的池中选择对象。@Javier@John V:如果它是线程本地的,那么它可能是线程不安全的,所以我猜不需要并发特定算法(因为普通的旧编程很好),所以我看不出这本书的引用有什么关系。@luiscubal你能解释一下线程本地对象是如何不安全的吗?请注意(取决于JVM实现)并不是每个对象都会在堆上结束(在堆上它需要垃圾收集);在正确的条件下,它们可能会在堆栈上结束(请参阅Escape Analysis)。@Mc


非多线程;它意味着每个线程有一个池。因为它是线程私有的,所以它不需要与其他线程同步以从它自己的池中选择对象。@Javier@John V:如果它是线程本地的,那么它可能是线程不安全的,所以我猜不需要并发特定算法(因为普通的旧编程很好),所以我看不出这本书的引用有什么关系。@luiscubal你能解释一下线程本地对象是如何不安全的吗?请注意(取决于JVM实现)并不是每个对象都会在堆上结束(在堆上它需要垃圾收集);在正确的条件下,它们可能会在堆栈上结束(请参阅Escape Analysis)。@McDowell,我当然希望看到Escape Analysis开始,但到目前为止,在我的测试中(热点1.6)如果你描述你的环境和当前的问题,而不是你解决问题的方法,你会得到更有用的答案。您对GC异常值的评论向我表明,您要么使用大量具有长生命周期的对象,要么使用大型对象。在任何一种情况下,每个线程池都可能是错误的解决方案。创建了一个包含“direct”ByteBuffers的线程本地池…并完全破坏了impl。如果试图写入大型堆缓冲区(分配为大型DirectBuffer,复制所有内容,但套接字缓冲区不包含[2m+数据],并且该过程重复多次)。直接缓冲区的主要问题不是GC本身;它完成了任务,但是一个非常小的java对象拥有大量的内存,而且不知道它应该被快速回收。另外,分配(和释放)直接ByteBuffer需要全局锁(+malloc,free)。没有特别的原因说明为什么不能在VM中管理直接BB。这样就不会有heap/directbb的区别,我们也不需要担心新的/GC的成本。不幸的是,有这个特殊的直接BB与额外的费用。我们应该把它们用于特殊目的。然而,IO impl需要大量的小型直接BB。为了解决这个冲突,我们可以分配一个巨大的直接BB,并使用它的一小部分。这意味着我们需要在Java平台上实现一个内存管理系统。这真是太愚蠢了。直接缓冲区的内存地址不能重新定位,而堆缓冲区可以,也就是说,只要缓冲区处于活动状态,地址就被固定。本机/内核可以随时使用该地址,因此JVM无法控制该地址。顺便说一句,我从不需要小字节缓冲区,我通常每个线程使用一个直接缓冲区,如果消息不在其中,未解析的剩余部分将被缓冲到一个堆字节缓冲区或字节[]。几乎所有的消息都可以作为一个单独的数据包来传递,或者完全解析,所以在一般情况下,这是很正常的。编写用于解析的状态机被认为是“困难的”,但在需要固定大小缓冲区的典型用法中,这个问题得到了缓解,并且缓冲区很快就会被释放。
channel.read(byteBuffer)