Imagine that you have a tile entity update that switches the redstone state of a block from on to off, but at the same time you have a block change event on a neighbouring block because, say, somebody placed a redstone lamp. It could read the state of the block, see it as on, and turn on the lamp, and then do the tile entity update and turn the block off, causing the block to have been seen in both the on and off state within the same tick. The lamp is now on when it should be off. Even if it gets corrected on the next tick or by forcing another block update, it's a transient error that could have cascading effects. The effects may be small and rare, but they eventually lead to those "Dammit, I don't understand why my redstone computer suddenly stops working..." complaints.
Threading is more than just making sure you've put locks around everything to avoid CMEs; you need to make sure that you maintain consistent behaviour on the whole data model, not just individual fields or objects, and although it's certainly not impossible, it's often much harder than you first expect.