锁代码块和锁方法的区别

对synchronized 一直理解不太清楚,锁住一个方法和锁住一个方法里所有的代码区别在哪呢?在网上看的说是wait的原因。

在线线程中调用wait方法的时候 要用synchronized锁住对象,确保代码段不会被多个线程调用

 

把方法里的代码全部锁住的代码
public class MilkBox {
    int num;
    boolean state = false;
    public MilkBox() {};
    public MilkBox(int num){this.num = num;}
    public void get(int i) {
    synchronized (MilkBox.class) {
        if (state) {
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        num =i;
        System.out.println("生产了第" + num + "瓶牛奶");
        state = true;
        notifyAll();
    }
        }
    public void set() {
        synchronized (MilkBox.class) {
            if (!state) {
                try {
                    wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
            System.out.println("取走了第" + num + "瓶牛奶");
            state = false;
            notifyAll();
        }
        }
}

锁住方法的代码

public class MilkBox {
    int num;
    boolean state = false;
    public MilkBox() {};
    public MilkBox(int num){this.num = num;}
    public synchronized void get(int i) {

        if (state) {
            try {
                wait();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        num =i;
        System.out.println("生产了第" + num + "瓶牛奶");
        state = true;
        notifyAll();
    }
        
    public synchronized void set() {
        
            if (!state) {
                try {
                    wait();
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
            
            System.out.println("取走了第" + num + "瓶牛奶");
            state = false;
            notifyAll();
        }
        
}

 

synchronized同步方法和同步代码块的区别

同步方法默认使用this或者当前类做为锁。

同步代码块可以选择以什么来加锁,比同步方法更精确,我们可以选择只有会在同步发生同步问题的代码加锁,而并不是整个方法。

同步方法使用synchronized修饰,而同步代码块使用synchronized(this){}修饰。

 

线程同步问题大都使用synchronized解决,有同步代码块和同步方法的两种方式,主要记一下这两种的区别

锁住方法和锁住代码机制是一样的,都是必须具备互斥(临界区)的功能,就是在同一时刻必须确保只有一个线程运行临界区的代码,具体到方法还是到代码块看需求定了。

锁代码块和锁方法,标准的说法应该是同步代码块同步方法。他们的区别其实就几个:

  • 写法
    • 同步代码块是写在方法中的
    • 同步方法是通过关键字标识方法
// 同步代码块
public void test2() {
    synchronized (锁) {
        // 代码
    }
}

// 同步方法
public synchronized void test1() {
    // 代码
}
  • 锁的范围
    • 同步代码块的范围是它大括号所包含的所有代码
    • 同步方法的范围是方法中的所有代码
  • 锁的类型
    • 同步代码块使用的锁是可以自定义的,可以是任意的对应或者类(类本质也是传入的一个对象)
    • 同步方法使用的锁是固定的,或者说是规定好的。
public class Test {

  public static void main(String[] args){
    Test t = new Test();
    t.test3();
  }

  // 使用当前类对象作为锁,在本例中就是使用 Test.class 作为锁
  public static synchronized void test1() {
  }
  // 等同于
  public void test2() {
    synchronized (Test.class) {
    }
  }

  // 使用 this 作为锁,在本例中就是使用对象 t 作为锁
  public synchronized void test3() {
  }
  // 等同于
  public void test4() {
    synchronized (this) {
    }
  }

}

 

0基础学JAVA(QQ即时通讯软件项目实训):https://edu.csdn.net/course/detail/2981

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632