synchronized修饰静态变量问题

#java
最近学了synchronized关键字,不是说只要给线程共享的变量加synchronized就可以加锁的吗,请问给位为什么给static 变量data加锁之后还是会有线程交替执行,并且结果不等于100000的情况呢
public class ThreadUnsafeDemo {
private static Integer data = 0;
public static void main(String[] args) throws Exception{
ThreadUnsafeDemo threadUnsafeDemo = new ThreadUnsafeDemo();
Thread a = new Thread(() -> {
synchronized (data){

                for (int i = 0; i < 50000; i++) {
                    System.out.println(Thread.currentThread().getName()+"++++++++++"+ ++data);
                }
            }

    });

    Thread b = new Thread(() -> {
            synchronized (data){
                for (int i = 0; i < 50000; i++) {
                    System.out.println(Thread.currentThread().getName()+"++++++++++"+ ++data);
                }
            }
    });

    a.start();
    b.start();
    a.join();
    b.join();

    System.out.println(data);
}

}

因为子线程调用了join方法,不调用join方法就是随机执行的。
调用join方法以后当前线程会等待正在运行的线程结束后才继续执行下面的代码。
你设置100000太大了,控制台有最大的显示范围,控制小一点看效果。