Proposal for Hybrid Threading Model and simpler Async IO

David Holmes david.holmes at oracle.com
Sun May 4 11:14:18 UTC 2014


Hi Joel,

On 4/05/2014 9:08 PM, Joel Richard wrote:
> Hi David,
>
> Thank you for your response. I have started a new thread here:
> http://cs.oswego.edu/pipermail/concurrency-interest/2014-May/012638.html
>
> I am aware that the required changes would be complicated, but I think
> it is worth a discussion since concurrency, non-blocking IO and high
> scalability will be even more important in the future. This feature
> would make it much easier to fulfill such requirements. For example, it
> would not be necessary anymore to create a second version of each so far
> blocking API.

What you are proposing already requires creating a second version. The 
bulk of the I/O code lies in the JDK libraries not the VM. If you want 
to make them non-blocking you will have to replace them all with 
non-blocking versions.

David
-----

> Also all standardized APIs like JDBC or JPA would suddenly
> all have a non-blocking implementation. The amount of work which could
> be saved would be enormous.
>
> Regards, Joel
>
>
> On Sun, May 4, 2014 at 2:46 AM, David Holmes <david.holmes at oracle.com
> <mailto:david.holmes at oracle.com>> wrote:
>
>     Hi Joel,
>
>     The best place to raise threading issues/discussions is on Doug
>     Lea's concurrency-interest mailing list.
>
>     http://altair.cs.oswego.edu/__mailman/listinfo/concurrency-__interest <http://altair.cs.oswego.edu/mailman/listinfo/concurrency-interest>
>
>     However I don't think this proposal will get much traction. There is
>     already async I/O in the core Java libraries. And making the
>     synchronization primitives non-blocking would require a completely
>     different implementation within the VM - something which would be
>     far too destabilizing to ever consider without some very significant
>     benefit.
>
>     Further fork-join tasks already go some way towards this, though
>     with a more limited programming model.
>
>     David Holmes
>
>
>     On 3/05/2014 2:34 AM, Joel Richard wrote:
>
>         Hi,
>
>         Recently I have researched a little about how different
>         languages implement
>         async IO because I wanted to implement a high scalability web
>         server. When
>         I looked at Google Go, I realized that the common callback
>         approach is
>         actually just a language-level workaround to fix a VM issue.
>
>         So I wondered how it could be possible to implement something
>         similar to
>         goroutines for the JVM. Here are my thoughts: There should be a
>         class
>         ThreadRoutine which implements the Runnable interface. If you
>         use any (so
>         far) blocking methods in it (like Thread.sleep, network/file
>         system IO,
>         Object.wait and synchronization) it uses however not the
>         blocking native
>         implementation, but an async version of it. While it waits for
>         the method
>         to complete, it can run another ThreadRoutine in the same native
>         thread.
>         This means that all ThreadRoutines can share a small native
>         thread pool. If
>         longer computations have to be done, the developer can either call
>         Thread.yield() from time to time or just moves the computation to a
>         classical thread.
>
>         With such an approach it would be much easier to write highly
>         scalable
>         server software* and it would make it even possible to run most
>         existing
>         libraries with minimal changes as asynchronous IO libraries.
>         Basically,
>         they would just have to make sure that they call Thread.yield()
>         in longer
>         computationally intensive loops and don't start additional
>         normal threads.
>         Last but not least, the behavior of existing threads wouldn't be
>         changed at
>         all.
>
>         * The advantage of async IO compared to blocking IO is that it
>         doesn’t
>         require expensive thread context switches and that it needs less
>         memory
>         (because fewer threads allocate less memory for stacks).
>
>         As mentioned above, this would require implementing an
>         asynchronous version
>         of all blocking native methods. I am not that familiar with JNI
>         nor C, but
>         I think this could by achieved by allowing the developer to
>         define a second
>         C function with the _async suffix which calls a callback instead of
>         returning a value. If the Java native method is called in a
>         normal thread,
>         the old C function is called and otherwise the _async version of
>         it. Since
>         Java already supports async IO with NIO, I think it should be
>         technically
>         possible to implement asynchronous versions for almost all of
>         the currently
>         blocking native functions. If an operating system doesn't
>         support certain
>         non-blocking operations, it could just block a special thread
>         instead (as
>         far as I know Go does it similar).
>
>         What do you think about this idea? Has something like that been
>         discussed
>         before?
>
>         Regards, Joel
>
>         P.S. I wasn't sure which mailing list is the correct for such an
>         idea. If
>         it is completely wrong here, please forward it.
>
>


More information about the jdk9-dev mailing list