疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

多线程关键字synchronized用法详述


 

   

  相信大家在开发中肯定会用到多线程的知识,而"synchronized"关键字肯定会用到的,这个修饰符在多线程里用来同步的,就是上锁的对象对应的方法或者代码块同一段时间内只能被一个线程调用,其他的线程就要等待。

  java里面每个对象都有一把锁,当线程访问这个对象监视的方法或者代码块时,就会给这个对象上锁,访问结束后解锁,其他等待的线程方能访问这些同步的方法或者代码块。

  注意:"synchronized"只能修饰方法或者普通代码块,不能修饰变量、构造块、静态块

  1、修饰非静态方法

  public class Share {

  public synchronized void share() {

  }

  public synchronized void pay() {

  }

  }

  如果一个线程访问了上面其中一个方法,其他线程也不访问另一个同步方法,因为这2个方法都给当前对象上锁,上锁对象一样,只要上锁对象一样,就必须要同步

  2、修饰静态方法

  public class Share {

  public synchronized void share() {

  }

  public synchronized void pay() {

  }

  public synchronized static void watch() {

  }

  public synchronized static void drink() {

  }

  }

  修饰静态方法,是给Share的Class对象上锁,上面2个静态方法锁的都是Share的Class对象上锁,而其他2个非静态方法给Share的对象上锁,所以访问静态方法是不会影响非静态方法的,就不存在同步一说

  3、修饰代码块

  public class Share {

  public synchronized void share() {

  }

  public synchronized void pay() {

  }

  public synchronized static void watch() {

  }

  public synchronized static void drink() {

  }

  public void go() {

  synchronized (this) {

  }

  synchronized (Share.class) {

  }

  }

  }

  go方法并没有被同步,他里面的代码块同步,第一个代码快给当前对象上锁,第二个给Share的Class对象上锁,每个类的Class对象只有一个