Java多线程 线程八锁

48 阅读2分钟

本文已参与「新人创作礼」活动, 一起开启掘金创作之路。

1.标准访问,先打印苹果还是android ? 先IOS再Android 2.睡觉4秒钟,先打印苹果还是android? 先IOS再Android

得出结论:类中有多个同步方法,同一时间内,只能有一个线程进行访问这些方法中的一个 也就是锁是当前对象this,synchronized是对象锁不是在方法上加锁,锁的是Phone()对象(object monitor) 被锁定后其他线程都不能进入到当前对象的其他synchronized方法

3.新增hello方法,先打印苹果还是hello? 先hello再IOS(吃面条和玩手机互不相干) 新增hello方法并不是同步方法所以互不影响

4.有两部手机,先打印苹果还是android? 先Android再IOS 多个线程抢一个资源,如果有两部手机,打电话互不影响 第一个锁的是phone 第二个锁的是phone1

5.两个静态同步方法,有一部手机,先打印苹果还是android? 先IOS再Android 6.两个静态同步方法,有2部手机,先打印苹果还是android? 先IOS再Android 静态方法锁,锁定的是phone.class这个模板,无论创建几个phone对象都是在一起锁着

7.一个静态同步方法,一个普通同步方法,有一部手机,先打印苹果还是android? 先Android再IOS 8.一个静态同步方法,一个普通同步方法,有2部手机,先打印苹果还是android? 先Android再IOS 一个是phone.class锁 一个是this对象phone锁 两个锁互不影响 一部手机苹果,一部手机苹果1,然后还有一个类锁和一个对象锁依然互不影响

package juc;

import java.util.concurrent.TimeUnit;

class GetPhone{
    public static synchronized void getIOS() throws InterruptedException{
        TimeUnit.SECONDS.sleep(3);
        System.out.println("得到IOS手机");
    }
    public static synchronized void getAndroid(){
        System.out.println("得到Android手机");
    }
    public void getHello(){
        System.out.println("hello");
    }
}
/*
标准访问,先打印苹果还是android ? 先IOS再Android
睡觉4秒钟,先打印苹果还是android? 先IOS再Android
新增he11o方法,先打印苹果还是hello? 先hello再IOS
有两部手机,先打印苹果还是android? 先Android再IOS
两个静态同步方法,有一部手机,先打印苹果还是android? 先IOS再Android
两个静态同步方法,有2部手机,先打印苹果还是android? 先IOS再Android
一个静态同步方法,一个普通同步方法,有一部手机,先打印苹果还是android? 先Android再IOS
一个静态同步方法,一个普通同步方法,有2部手机,先打印苹果还是android? 先Android再IOS
 */

public class EightLockDemo {
    public static void main(String[] args){

        GetPhone phone = new GetPhone();
        GetPhone phone1= new GetPhone();

        new Thread(()->{
            try {
                phone.getIOS();
            }catch (Exception e){
                e.printStackTrace();
            }
        },"AA").start();

        new Thread(()->{
                phone.getAndroid();
                //phone.getHello();
                //phone1.getAndroid();
        },"BB").start();
    }

}