Synchronized
是java中用于多线程同步的一个关键字.通常我们可以将其理解为一把锁.依稀记得大学时候的老师说的一个案例.有个气质优雅的女生,男的都想和她结婚, 又中国是一夫一妻制的,如果男的和她登记结婚了,那么别的男的就没办法,因为这个男的有锁(可以理解为结婚证), 除非她离婚了(没有结婚证,也就没有锁了),那么别的男的就可以追求她了.才能和她结婚.从这个案例中,我们大致了解到了为什么要有锁(一夫一妻制),以及锁的功能.
在java代码中, Synchronized通常可以修饰如下对象.
1. 修饰一个方法.
通常有两种书写方式:
是java中用于多线程同步的一个关键字.通常我们可以将其理解为一把锁.依稀记得大学时候的老师说的一个案例.有个气质优雅的女生,男的都想和她结婚, 又中国是一夫一妻制的,如果男的和她登记结婚了,那么别的男的就没办法,因为这个男的有锁(可以理解为结婚证), 除非她离婚了(没有结婚证,也就没有锁了),那么别的男的就可以追求她了.才能和她结婚.从这个案例中,我们大致了解到了为什么要有锁(一夫一妻制),以及锁的功能.
在java代码中, Synchronized通常可以修饰如下对象.
1. 修饰一个方法.
通常有两种书写方式:
第一种:
public synchronized void test(){ System.out.println(Thread.currentThread().getId()); }
第二种:
public void test(){ synchronized (this) { System.out.println(Thread.currentThread().getId()); } }
对这个test方法,他们的功能都是一样的,但如果当前类的还有别的用synchronized(this)修饰的方法,他们就有差异了.
2. 修饰一个类
通常形如方法synchronized(***.class)和第一种大致类似,和修饰方法相比.只不过锁的范围更大了.
public void test(){ synchronized (FirstInstanceAlgori.class) { System.out.println(Thread.currentThread().getId()); } }
3. 修饰一个内部对象
如下所示,
public Byte[] lock = new Byte[0];
public void test(){ synchronized (lock) { System.out.println(Thread.currentThread().getId()); } }
总结,1. 不管synchronized修饰谁,第一步我们都需要明确锁定的是谁(锁的范围),谁拥有这把锁.
2. 理清第一点后,我们应该明白synchronized 关键字不能被继承,它之负责锁住当前自己负责的部分.
3. 除了修饰方法,修饰类,修饰一个内部对象,或者是修饰静态方法,他们的内涵都是一样的,有空回想回想.