Java关键字之Synchronized

Synchronized

  是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. 除了修饰方法,修饰类,修饰一个内部对象,或者是修饰静态方法,他们的内涵都是一样的,有空回想回想.


猜你喜欢

转载自blog.csdn.net/woxueplc/article/details/80170639