首先我们来理解同步方法:
不同线程中的同一实例在同一时间只能执行一个同步方法。
不好理解对不对,那我们想象一下。
你是个酷Boy,你有一些喜欢吃的食物(同步方法food1,food2),你同时和几个女孩一起出去玩(不同线程girl1,girl2),她们同时给了你喜欢的食物,你吃完一个才能吃另一个(左一口右一口属实欠揍)。
代码如下:
class Boy{
synchronized void food1(){ //需要吃10s
for(int i=0;i<10;i++) {
System.out.println("吃food1");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
synchronized void food2() { //需要吃10s
for(int i=0;i<10;i++) {
System.out.println("吃food2");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Test {
public static void main(String args[]) {
Boy boy=new Boy();
Thread girl1=new Thread(new Runnable() { //女孩1
public void run() {
boy.food1();
}
});
Thread girl2=new Thread(new Runnable() { //女孩2
public void run() {
boy.food2();
}
});
girl1.start();
girl2.start();
}
}
接下来再来理解同步块:
多个线程同一时间只能有一条进入同步块执行其中代码。
那我们可以理解为:
你们一行人玩累了去厕所,同时只能有一个人进入厕所(单人厕所)。
代码如下:
class Wc{
public void wc(String username) {
synchronized("") {
for(int i=0;i<10;i++) {//需要上10s
System.out.println(username+"在上厕所");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
public class Test {
public static void main(String args[]) {
Thread girl1=new Thread(new Runnable() {
public void run() {
new Wc().wc("girl1");
}
});
Thread girl2=new Thread(new Runnable() {
public void run() {
new Wc().wc("girl1");
}
});
girl1.start();
girl2.start();
}
}
顺便再聊一下多线程的非同步问题吧,多线程在同时运行时会轮流获取电脑资源,从而达到同步运行的效果。
可以理解为,你会一会儿和这个人聊两句,一会儿和那个人聊两句。