JUC-8锁问题

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("打电话");
    }
}

原文地址:https://www.cnblogs.com/sinlearn/p/14681700.html