八锁现象

        8锁,就是关于锁的8个问题

        1.两个普通的同步方法,一个对象,两个线程先打印发短信还是打电话?

import java.util.concurrent.TimeUnit;

/**
 * 1.两个普通的同步方法,一个对象,两个线程先打印发短信还是打电话? --  1.发短信  2.打电话
 */
public class Test01 {
    public static void main(String[] args) {
        Phone phone = new Phone();

        new Thread(()->{
            phone.sendSMS();
        },"A").start();

      
        new Thread(()->{
            phone.call();
        },"B").start();

    }
}


class Phone{
    //synchronized 锁的对象是方法的调用者
    //两个方法用的同一个锁,谁先拿到锁谁就先执行
    public synchronized void sendSMS(){
        System.out.println("发短信");
    }

    public synchronized void call(){
        System.out.println("打电话");
    }
}

        2.两个普通的同步方法,一个对象,发短信休眠4s,两个线程先打印发短信还是打电话?

import java.util.concurrent.TimeUnit;

/**
 * 2.两个普通的同步方法,一个对象,发短信休眠4s,两个线程先打印发短信还是打电话? -- 1.发短信  2.打电话
 */
public class Test01 {
    public static void main(String[] args) {
        Phone phone = new Phone();

        new Thread(()->{
            phone.sendSMS();
        },"A").start();

        //休眠1秒
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(()->{
            phone.call();
        },"B").start();

    }
}


class Phone{
    //synchronized 锁的对象是方法的调用者
    //两个方法用的同一个锁,谁先拿到锁谁就先执行
    public synchronized void sendSMS(){
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("发短信");
    }

    public synchronized void call(){
        System.out.println("打电话");
    }
}

        3.一个普通方法(非同步),一个普通的同步方法,一个对象,两个线程先打印发短信还是hello?

import java.util.concurrent.TimeUnit;

/**
 * 3.一个普通方法(非同步),一个普通的同步方法,一个对象,两个线程先打印发短信还是hello? --  1.hello  2.发短信
 */
public class Test02 {
    public static void main(String[] args) {

    Phone2 phone = new Phone2();

    new Thread(()->{
        phone.sendSMS();
    },"A").start();

    //休眠1秒
    try {
        TimeUnit.SECONDS.sleep(1);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    new Thread(()->{
        phone.hello();
    },"B").start();

}
}


class Phone2{
    //synchronized 锁的对象是方法的调用者
    //两个方法用的同一个锁,谁先拿到锁谁就先执行
    public synchronized void sendSMS(){
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("发短信");
    }

    public synchronized void call(){
        System.out.println("打电话");
    }

    //这里没有锁!不是同步方法块,不受锁的影响
    public void hello(){
        System.out.println("你好");
    }
}

        4.两个同步方法,两个对象, 两个线程先打印发短信还是打电话?

import java.util.concurrent.TimeUnit;

/**
 * 4.两个同步方法,两个对象, 两个线程先打印发短信还是打电话 --  1.打电话  2.发短信
 */
public class Test03 {
    public static void main(String[] args) {
        //2个对象,2个调用者,两把锁
        Phone3 phone1 = new Phone3();
        Phone3 phone2 = new Phone3();

        new Thread(()->{
            phone1.sendSMS();
        },"A").start();

        //休眠1秒
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(()->{
            phone2.call();
        },"B").start();
    }
}




class Phone3{
    //synchronized 锁的对象是方法的调用者
    //两个方法用的同一个锁,谁先拿到锁谁就先执行
    public synchronized void sendSMS(){
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("发短信");
    }

    public synchronized void call(){
        System.out.println("打电话");
    }

    //这里没有锁!不是同步方法块,不受锁的影响
    public void hello(){
        System.out.println("你好");
    }
}

        5.两个静态的同步方法,一个对象,两个线程先打印发短信还是打电话?

import java.util.concurrent.TimeUnit;
/**
 * 5.两个静态的同步方法,一个对象,两个线程先打印发短信还是打电话 -- 1.发短信 2.打电话
 */
public class Test04 {
    public static void main(String[] args) {

        Phone4 phone = new Phone4();

        new Thread(()->{
            phone.sendSMS();
        },"A").start();

        //休眠1秒
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(()->{
            phone.call();
        },"B").start();

    }
}


class Phone4{
    //synchronized 锁的对象是方法的调用者
    //static 静态方法
    //类一加载就有了,锁的是Class
    public static synchronized void sendSMS(){
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("发短信");
    }

    public static synchronized void call(){
        System.out.println("打电话");
    }
}

        6.两个静态的同步方法,两个对象,两个线程先打印发短信还是打电话?

/**
 * 6.两个静态的同步方法,两个对象,两个线程先打印发短信还是打电话 -- 1.发短信 2.打电话
 */
public class Test05 {
    public static void main(String[] args) {

        //连个对象的Class类模板只有一个,static,锁的是Class
        Phone5 phone1 = new Phone5();
        Phone5 phone2 = new Phone5();

        new Thread(()->{
            phone1.sendSMS();
        },"A").start();

        //休眠1秒
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(()->{
            phone2.call();
        },"B").start();

    }
}


//Phone5 唯一的一个Class对象
class Phone5{
    //synchronized 锁的对象是方法的调用者
    //static 静态方法
    //类一加载就有了,锁的是Class
    public static synchronized void sendSMS(){
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("发短信");
    }

    public static synchronized void call(){
        System.out.println("打电话");
    }

}

         7. 一个静态同步方法,一个普通的同步方法,一个对象,两个线程先打印发短信还是打电话?

import java.util.concurrent.TimeUnit;

/**
 * 7. 一个静态同步方法,一个普通的同步方法,一个对象,两个线程先打印发短信还是打电话--1.打电话 2.发短信
 */
public class Test06 {
    public static void main(String[] args) {

        //连个对象的Class类模板只有一个,static,锁的是Class
        Phone6 phone = new Phone6();

        new Thread(()->{
            phone.sendSMS();
        },"A").start();

        //休眠1秒
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(()->{
            phone.call();
        },"B").start();

    }
}


//Phone6 唯一的一个Class对象
class Phone6{
    //synchronized 锁的对象是方法的调用者
    //static 静态方法
    //类一加载就有了,锁的是Class
    public static synchronized void sendSMS(){
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("发短信");
    }

    //普通的同步方法,锁的是调用者
    public synchronized void call(){
        System.out.println("打电话");
    }

}

         8. 一个静态同步方法,一个普通的同步方法,两个对象,两个线程先打印发短信还是打电话 ?

import java.util.concurrent.TimeUnit;

/**
 * 8. 一个静态同步方法,一个普通的同步方法,两个对象,两个线程先打印发短信还是打电话--1.打电话 2.发短信
 */
public class Test07 {
    public static void main(String[] args) {
        //连个对象的Class类模板只有一个,static,锁的是Class
        Phone7 phone1 = new Phone7();
        Phone7 phone2 = new Phone7();
        new Thread(() -> {
            phone1.sendSMS();
        }, "A").start();
        //休眠1秒
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        new Thread(() -> {
            phone2.call();
        }, "B").start();
    }
}

//Phone3 唯一的一个Class对象
class Phone7 {
    //静态的同步方法,锁的是Class
    public static synchronized void sendSMS() {
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("发短信");
    }

    //普通的同步方法,锁的是调用者
    public synchronized void call() {
        System.out.println("打电话");
    }
}

小结

        new this 具体的一个手机

        static Class 唯一的一个模板

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值