Should you synchronize the run method? Why or why not? Should you synchronize the run method? Why or why not? multithreading multithreading

Should you synchronize the run method? Why or why not?


Synchronizing the run() method of a Runnable is completely pointless unless you want to share the Runnable among multiple threads and you want to sequentialize the execution of those threads. Which is basically a contradiction in terms.

There is in theory another much more complicated scenario in which you might want to synchronize the run() method, which again involves sharing the Runnable among multiple threads but also makes use of wait() and notify(). I've never encountered it in 21+ years of Java.


There is 1 advantage to using synchronized void blah() over void blah() { synchronized(this) { and that is your resulting bytecode will be 1 byte shorter, since the synchronization will be part of the method signature instead of an operation by itself. This may influence the chance to inline the method by the JIT compiler. Other than that there is no difference.

The best option is to use an internal private final Object lock = new Object() to prevent someone from potentially locking your monitor. It achieves the same result without the downside of the evil outside locking. You do have that extra byte, but it rarely makes a difference.

So I would say no, don't use the synchronized keyword in the signature. Instead, use something like

public class ThreadedClass implements Runnable{    private final Object lock = new Object();    public void run(){        synchronized(lock) {            while(true)                 //do some stuff in a thread            }        }    }}

Edit in response to comment:

Consider what synchronization does: it prevents other threads from entering the same code block. So imagine you have a class like the one below. Let's say the current size is 10. Someone tries to perform an add and it forces a resize of the backing array. While they're in the middle of resizing the array, someone calls a makeExactSize(5) on a different thread. Now all of a sudden you're trying to access data[6] and it bombs out on you. Synchronization is supposed to prevent that from happening. In multithreaded programs you need simply NEED synchronization.

class Stack {    int[] data = new int[10];    int pos = 0;    void add(int inc) {        if(pos == data.length) {            int[] tmp = new int[pos*2];            for(int i = 0; i < pos; i++) tmp[i] = data[i];            data = tmp;        }        data[pos++] = inc;    }    int remove() {        return data[pos--];    }    void makeExactSize(int size) {        int[] tmp = new int[size];        for(int i = 0; i < size; i++) tmp[i] = data[i];        data = tmp;    }}


Why? Minimal extra safety and I don't see any plausible scenario where it would make a difference.

Why not? It's not standard. If you are coding as part of a team, when some other member sees your synchronized run he'll probably waste 30 minutes trying to figure out what is so special either with your run or with the framework you are using to run the Runnable's.