I really like the language, enough to use it and work around the lack of generics, but that's a glaring weakness. They need some way to enable container classes.
Channels are a way of queueing work, which is great for many use cases.
You can use mutexes and shared memory if your situation calls for it. For example, if I am doing a graph traversal concurrently, I can use channels to send the work to many listening threads as I traverse that graph synchronously.
If for some reason, I need to update that graph's representation asynchronously, I may need to use mutexes to lock the graph since the graph is now shared memory.
[1] http://concurrencyfreaks.blogspot.com/2013/11/stampedlocktry...
[2] http://mechanical-sympathy.blogspot.ca/2013/08/lock-based-vs...
But the major problem is that many of the Java bashers tend to criticise without knowing what is possible to do in the Java ecosystem.
To answer your question, yes: my own library, Quasar[1], provides lightweight threads for Java.
The first set of JVMs did implement green threads, which are what goroutines are. Shortly thereafter most of them switched to red threads, aka real threads.
You can still find a few JVMs that use green threads, like Squawk.
https://java.net/projects/squawk/pages/SquawkDesign
Other than that, java.util.concurrent provides mechanisms to map multiple tasks to single OS threads.
Operating systems have been able to handle an order of magnitude more pthreads than that since the day pthreads were introduced.