8鎖,關于鎖的8個問題
1、標準情況下,兩個線程先打印 發(fā)短信 還是 打電話?發(fā)短信
2、sendMsm延遲4秒,兩個線程先打印 發(fā)短信 還是 打電話?發(fā)短信
public class Test1 {
public static void main(String[] args) {
Phone phone = new Phone();
new Thread(() -> {
phone.sendMsg();
}, "A").start();
try{
TimeUnit.SECONDS.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
new Thread(() -> {
phone.call();
}, "B").start();
}
}
class Phone {
//synchronized 鎖的對象時方法的調(diào)用者!
//兩個方法是同一個鎖,誰先拿到誰執(zhí)行
public synchronized void sendMsg(){
try{
TimeUnit.SECONDS.sleep(4);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("發(fā)短信");
}
public synchronized void call() {
System.out.println("打電話");
}
}
3、增加一個普通方法,先打印 發(fā)短信 還是 hello? hello
4、兩個對象,兩個同步方法,先打印 發(fā)短信 還是 打電話? 打電話
public class Test2 {
public static void main(String[] args) {
Phone2 phone1 = new Phone2();
Phone2 phone2 = new Phone2();
new Thread(() -> {
phone1.sendMsg();
}, "A").start();
try{
TimeUnit.SECONDS.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
new Thread(() -> {
phone1.hello();
}, "B").start();
new Thread(() -> {
phone2.call();
}, "B").start();
}
}
class Phone2 {
//synchronized 鎖的對象時方法的調(diào)用者!
public synchronized void sendMsg(){
try{
TimeUnit.SECONDS.sleep(4);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("發(fā)短信");
}
public synchronized void call() {
System.out.println("打電話");
}
//這里沒有鎖!不是同步方法,不受所得影響
public void hello() {
System.out.println("hello hello");
}
}
5、增加兩個靜態(tài)變量,只有一個對象,先打印 發(fā)短信 還是 打電話? 發(fā)短信
6、增加兩個靜態(tài)變量,兩個對象,先打印 發(fā)短信 還是 打電話? 發(fā)短信
public class Test3 {
public static void main(String[] args) {
//兩個對象的Class模板只有一個
Phone3 phone1 = new Phone3();
Phone3 phone2 = new Phone3();
new Thread(() -> {
phone1.sendMsg();
}, "A").start();
try{
TimeUnit.SECONDS.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
new Thread(() -> {
phone1.call();
}, "B").start();
new Thread(() -> {
phone2.call();
}, "B").start();
}
}
//Phone3只有唯一的一個Class對象
class Phone3 {
//synchronized 鎖的對象時方法的調(diào)用者!
//static 靜態(tài)方法,類一加載就有了,鎖的是Class
public static synchronized void sendMsg(){
try{
TimeUnit.SECONDS.sleep(4);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("發(fā)短信");
}
public static synchronized void call() {
System.out.println("打電話");
}
}
7、一個普通同步方法,一個靜態(tài)同步方法,一個對象,先打印發(fā)短信還是打電話? 打電話
8、一個普通同步方法,一個靜態(tài)同步方法,兩個個對象,先打印發(fā)短信還是打電話? 打電話
public class Test4 {
public static void main(String[] args) {
Phone4 phone = new Phone4();
Phone4 phone2 = new Phone4();
new Thread(() -> {
phone.sendMsg();
}, "A").start();
try{
TimeUnit.SECONDS.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
new Thread(() -> {
phone2.call();
}, "B").start();
}
}
class Phone4 {
//鎖的是Class類模板
public static synchronized void sendMsg(){
try{
TimeUnit.SECONDS.sleep(4);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("發(fā)短信");
}
//鎖的是調(diào)用者
public synchronized void call() {
System.out.println("打電話");
}
}
小結
new 對象,鎖具體的一個Phone
static Class 鎖唯一的類模板