对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