contract-code gets executed IN a virtual machine during tx-processing; code can interact with the whole VM state & therefore needs to be synchronised between TXs, hence single-threaded
This is also an issue that is greatly mitigated w/ sharding - something high on Ethereum's priority list, for what it's worth. IMO a must for any PoW blockchain to scale massively.