Static variables are shared between all Threads, thats what makes them static. If you want to use different values, either use ThreadLocals or (much better), use different objects with non-static variables in the differrent threads. Without further code it's difficult to say more though.
Synchronisation merely controls the threads' access to the shared state.
If you want separate state per thread then you need to either declare different instances of that information (e.g. classes) per thread. e.g. simply instantiate a new object in each Thread's run()method, or perform a copy of the structure in question (e.g. a deep copy of a collection)
An alternative is to investigate ThreadLocal, in which each Thread will have a different copy of a nominated resource.