Java中synchronized用在静态方法和非静态方法上面的区别
在Java中,synchronized是用来表示同步的,我们可以synchronized来修饰一个方法。也可以synchronized来修饰方法里面的一个语句块。那么,在static方法和非static方法前面加synchronized到底有什么不同呢?大家都知道,static的方法属于类方法,它属于这个Class(注意:这里的Class不是指Class的某个具体对象),那么static获取到的锁,是属于类的锁。而非static方法获取到的锁,是属于当前对象的锁。所以,他们之间不会产生互斥。
看代码:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | publicclassDemo {    publicstaticsynchronizedvoidstaticFunction()            throwsInterruptedException {        for(inti = 0; i < 3; i++) {            Thread.sleep(1000);            System.out.println("Static function running...");        }    }    publicsynchronizedvoidfunction() throwsInterruptedException {        for(inti = 0; i <3; i++) {            Thread.sleep(1000);            System.out.println("function running...");        }    }    publicstaticvoidmain(String[] args) {        finalDemo demo = newDemo();        Thread thread1 = newThread(newRunnable() {            @Override            publicvoidrun() {                try{                    staticFunction();                } catch(InterruptedException e) {                    e.printStackTrace();                }            }        });        Thread thread2 = newThread(newRunnable() {            @Override            publicvoidrun() {                try{                    demo.function();                } catch(InterruptedException e) {                    e.printStackTrace();                }            }        });        thread1.start();        thread2.start();    }} | 
运行结果是:
| 1 2 3 4 5 6 | function running...Static function running...function running...Static function running...function running...Static function running... | 
那当我们想让所有这个类下面的方法都同步的时候,也就是让所有这个类下面的静态方法和非静态方法共用同一把锁的时候,我们如何办呢?此时我们可以使用Lock。