Updating is read-only (no modification of any player or npc related variables) as a result it is fairly easy to multithread it. Ingame content on the other hand is subject to change at any millisecond and as a result, it would be a pain to multithread.
Personally, the current design that I use is heavily inspired by hyperion, mainly because I feel that hyperion accomplishes it in the simplest and easiest way to debug.
Basic design: Threads / Threadpools in use.
-->Threads used by netty, or in teh case of hyperion mina.
-->The threadpool used by player updating. Related to the number of cores.
-->The game logic thread, all read and write only tasks are executed on this thread when the server is NOT updating the players. If the server is updating players, these tasks will be queued for later.
-->The game engine thread which allows the above threads to coincide without concurrency errors.