1-2 锁
/**
* 8锁问题,就是关于锁的8个问题!,判断锁的是谁
*/
import java.util.concurrent.TimeUnit;
/**
* 1.标志情况下,两个线程先打印,发短信? 打电话?
* 2.sendSms延迟4秒,两个线程先打印,发短信? 打电话?
*/
public class Lock_1To2 {
public static void main(String[] args) throws InterruptedException {
Phone phone = new Phone();
//发短信
new Thread(()->{
try {
phone.sendSms();
} catch (InterruptedException e) {
e.printStackTrace();
}
},"发短信").start();
//延时
TimeUnit.SECONDS.sleep(1);
//打电话
new Thread(()->{
phone.call();
},"打电话").start();
}
}
class Phone{
//synchronized 锁的对象是方法的调用者
//两个方法使用的是同一个锁,哪个先拿到哪个先执行
public synchronized void sendSms() throws InterruptedException {
TimeUnit.SECONDS.sleep(4);
System.out.println("发短信");
}
public synchronized void call(){
System.out.println("打电话");
}
}
synchronized 锁的对象是方法的调用者
两个方法使用的是同一个锁,哪个先拿到哪个先执行
3-4锁
/**
* 8锁问题,就是关于锁的8个问题!,判断锁的是谁
*/
import java.util.concurrent.TimeUnit;
/**
* 3.静态方法,普通方法 打电话?发短信?
* 4.不同对象 打电话?发短信?
*/
public class Lock_3To4 {
public static void main(String[] args) throws InterruptedException {
Phone2 phone2 = new Phone2();
Phone2 phone3 = new Phone2();
//发短信
new Thread(()->{
try {
phone2.sendSms();
} catch (InterruptedException e) {
e.printStackTrace();
}
},"发短信").start();
//延时
TimeUnit.SECONDS.sleep(1);
//打电话
new Thread(()->{
phone3.call();
},"打电话").start();
}
}
class Phone2{
//synchronized 锁的对象是方法的调用者
//两个方法使用的是同一个锁,哪个先拿到哪个先执行
public synchronized void sendSms() throws InterruptedException {
TimeUnit.SECONDS.sleep(4);
System.out.println("发短信");
}
public synchronized void call(){
System.out.println("打电话");
}
//不是同步方法,不受锁的影响
public void hello(){
System.out.println("hello");
}
}
5-6锁
/**
* 8锁问题,就是关于锁的8个问题!,判断锁的是谁
*/
import java.util.concurrent.TimeUnit;
/**
* 5.静态同步方法,同一对象,发短信? 打电话?
* 6.静态同步方法,不同对象,两个线程先打印,发短信? 打电话?
*/
public class Lock_5To6 {
public static void main(String[] args) throws InterruptedException {
Phone3 phone1 = new Phone3();
Phone3 phone2 = new Phone3();
//发短信
new Thread(()->{
try {
phone1.sendSms();
} catch (InterruptedException e) {
e.printStackTrace();
}
},"发短信").start();
//延时
TimeUnit.SECONDS.sleep(1);
//打电话
new Thread(()->{
phone2.call();
},"打电话").start();
}
}
class Phone3{
//static 类一加载就有了!锁的是Class,模版
//synchronized 锁的对象是方法的调用者
//两个方法使用的是同一个锁,哪个先拿到哪个先执行
public static synchronized void sendSms() throws InterruptedException {
TimeUnit.SECONDS.sleep(4);
System.out.println("发短信");
}
public static synchronized void call(){
System.out.println("打电话");
}
}
7-8锁
/**
* 7.静态同步方法和同步方法 ,同一对象 发短信?打电话?
* 8.静态同步方法和同步方法 ,不同对象 发短信?打电话?
*/
import java.util.concurrent.TimeUnit;
public class Lock_7To8 {
public static void main(String[] args) throws InterruptedException {
Phone4 phone1 = new Phone4();
// Phone4 phone2 = new Phone4();
//发短信
new Thread(()->{
try {
phone1.sendSms();
} catch (InterruptedException e) {
e.printStackTrace();
}
},"发短信").start();
//延时
TimeUnit.SECONDS.sleep(1);
//打电话
new Thread(()->{
phone1.call();
},"打电话").start();
}
}
class Phone4{
//synchronized 锁的对象是方法的调用者
//两个方法使用的是同一个锁,哪个先拿到哪个先执行
public static synchronized void sendSms() throws InterruptedException {
TimeUnit.SECONDS.sleep(4);
System.out.println("发短信");
}
public synchronized void call(){
System.out.println("打电话");
}
}