I have looked through the documentation and have found 2 methods for multithreading servlet methods, (1)synchronizing (2)singlethreadmodel. (1) could cause deadlocking and congestion, (2) has been deprecated as of 2.4. Are there other approaches?
Certainly. Just write good code. Keep in mind that there is only one instance of the servlet in application's lifetime which is to be (re)used among all requests. So whenever you use instance variables, then those won't be threadsafe. But if you use method local variables, those will be threadsafe. Whether threadsafety has impact depends on the variable in question. If the variable is intented to hold request or session scoped values (e.g. request parameters, logged in user, etc), just declare them in method block. If the variable is intented to hold application scoped values (e.g. the DAO class, some constants, etc), then you can safely declare it as instance variable.
There's absolutely no need for synchronizing or SingleThreadModel if you write correct code (that's also one of the reasons why SingleThreadModel is deprecated).