当前位置: 首页 > news >正文

Java八锁现象

文章目录

  • 八锁现象
    • 一、简介
    • 二、代码案例
      • 1、案例1
      • 2、案例2
      • 3、案例3
      • 4、案例4
      • 5、案例5
      • 6、案例6
      • 7、案例7
      • 8、案例8


八锁现象

一、简介

  • synchronized 锁的对象是方法的调用者
  • 两个方法用的是同一个锁,谁先拿到谁执行
  • 普通的方法是用对象操作的(同步方法 对象)
  • static静态方法是用Class操作的(静态同步方法 Class)
  • new this 具体的一个手机
  • static Class 唯一的一个模板

八种情况:
两个同步方法,一个对象(发短信,打电话)
两个同步方法,一个对象,发短信延迟(发短信,打电话)
一个同步方法,一个普通方法,一个对象,同步方法延迟(打电话,发短信)
两个同步方法,两个对象,发短信延迟(打电话,发短信)
两个静态同步方法,一个对象,发短信延迟(发短信,打电话)
两个静态同步方法,两个对象,发短信延迟(发短信,打电话)
一个静态同步方法,一个普通同步方法,一个对象,静态同步方法延迟(打电话,发短信)
一个普通同步方法,一个静态同步方法,两个对象,静态同步方法延迟(打电话,发短信)

二、代码案例

1、案例1

package com.sgz.lock8;

import java.util.concurrent.TimeUnit;

/**
 * 日期:2022/8/30 - 10:34
 * 需求:两个同步方法,一个对象(发短信,打电话)
 */
public class Lock01 {
    public static void main(String[] args) {

        Phone phone = new Phone();

        // 锁的存在
        new Thread(() -> {
            phone.sendSms();
        }, "A").start();

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

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

class Phone {

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

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

2、案例2

package com.sgz.lock8;

import java.util.concurrent.TimeUnit;

/**
 * 日期:2022/8/30 - 10:34
 * 需求:两个同步方法,一个对象,发短信延迟(发短信,打电话)
 */
public class Lock02 {
    public static void main(String[] args) {

        Phone2 phone = new Phone2();

        // 锁的存在
        new Thread(() -> {
            phone.sendSms();
        }, "A").start();

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        new Thread(() -> {
            phone.call();
        }, "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("打电话");
    }
}

3、案例3

package com.sgz.lock8;

import java.util.concurrent.TimeUnit;

/**
 * 日期:2022/8/30 - 10:34
 * 需求:一个同步方法,一个普通方法,一个对象,同步方法延迟(hello,发短信)
 */
public class Lock03 {
    public static void main(String[] args) {

        Phone3 phone = new Phone3();

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

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

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

class Phone3 {

    public synchronized void sendSms() {
        try {
            TimeUnit.SECONDS.sleep(3);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("发短信");
    }

    // 没有锁,不是同步方法,不受锁的影响
    public  void call() {
        System.out.println("打电话");
    }
}

4、案例4

package com.sgz.lock8;

import java.util.concurrent.TimeUnit;

/**
 * 日期:2022/8/30 - 10:34
 * 需求:两个同步方法,两个对象,发短信延迟(打电话,发短信)
 */
public class Lock04 {
    public static void main(String[] args) {

        // 两个对象,两个调用者,两把锁,与时间无关
        Phone4 phone1 = new Phone4();
        Phone4 phone2 = new Phone4();

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

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

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

class Phone4 {

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

5、案例5

package com.sgz.lock8;

import java.util.concurrent.TimeUnit;

/**
 * 日期:2022/8/30 - 10:34
 * 需求:两个静态同步方法,一个对象,发短信延迟(发短信,打电话)
 */
public class Lock05 {
    public static void main(String[] args) {

        Phone5 phone = new Phone5();

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

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

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

class Phone5 {

    // 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

package com.sgz.lock8;

import java.util.concurrent.TimeUnit;

/**
 * 日期:2022/8/30 - 10:34
 * 需求:两个静态同步方法,两个对象,发短信延迟(发短信,打电话)
 */
public class Lock06 {
    public static void main(String[] args) {

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

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

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

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

// Phone6 唯一的一个 Class 对象
class Phone6 {

    // 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、案例7

package com.sgz.lock8;

import java.util.concurrent.TimeUnit;

/**
 * 日期:2022/8/30 - 10:34
 * 需求:一个静态同步方法,一个普通同步方法,一个对象,静态同步方法延迟(打电话,发短信)
 */
public class Lock07 {
    public static void main(String[] args) {

        Phone7 phone = new Phone7();

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

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

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

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

8、案例8

package com.sgz.lock8;

import java.util.concurrent.TimeUnit;

/**
 * 日期:2022/8/30 - 10:34
 * 需求:一个普通同步方法,一个静态同步方法,两个对象,静态同步方法延迟(打电话,发短信)
 */
public class Lock08 {
    public static void main(String[] args) {

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

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

        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

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

class Phone8 {

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

相关文章:

  • 谷氨酸三方突触丨SYSY谷氨酸GluA解决方案
  • 做一个校园跑腿小程序需要多少成本?
  • js实现pdf、word、excel、图片、html文件预览及下载
  • 孙卫琴的《精通Vue.js》读书笔记-注册全局组件和局部组件
  • 28、iNeRF
  • 相关性 与 独立性
  • set和map的模拟
  • window环境下安装大数据环境
  • 解决navicat premium连接数据库自动断开问题
  • 学历提升中的我,入职产品经理之路
  • 网络安全专家,这5本入门秘籍人手一套
  • 智源AI日报(2022-08-30): 华为谢凌曦:关于视觉识别领域发展的个人观点
  • 示波器十大基础知识你都了解多少
  • 【经典算法学习-排序篇】冒泡排序
  • Nacos系列【26】源码分析篇之客户端自动注册
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • Electron入门介绍
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Java IO学习笔记一
  • javascript面向对象之创建对象
  • JavaScript设计模式之工厂模式
  • java中具有继承关系的类及其对象初始化顺序
  • js面向对象
  • nginx 负载服务器优化
  • Octave 入门
  • React 快速上手 - 07 前端路由 react-router
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Webpack 4x 之路 ( 四 )
  • webpack入门学习手记(二)
  • 创建一种深思熟虑的文化
  • 技术胖1-4季视频复习— (看视频笔记)
  • 前端设计模式
  • 前端性能优化--懒加载和预加载
  • 前嗅ForeSpider中数据浏览界面介绍
  • 手机app有了短信验证码还有没必要有图片验证码?
  • ​插件化DPI在商用WIFI中的价值
  • ![CDATA[ ]] 是什么东东
  • # Apache SeaTunnel 究竟是什么?
  • (2)MFC+openGL单文档框架glFrame
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (八)Flask之app.route装饰器函数的参数
  • (定时器/计数器)中断系统(详解与使用)
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (强烈推荐)移动端音视频从零到上手(上)
  • (四)鸿鹄云架构一服务注册中心
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • **PHP分步表单提交思路(分页表单提交)
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .php结尾的域名,【php】php正则截取url中域名后的内容
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • ??在JSP中,java和JavaScript如何交互?
  • @Resource和@Autowired的区别