Synchronized内置锁

理论:

  多个线程之间共享资源就会发成数据上的冲突,我们往往会使用Synchronized关键字来实现锁

  这个锁要不加在方法上,要么以同步块的形式来使用,它最大作用就是确保多个线程在同一时刻,只能有一个线程处于方法和同步块之中,这样它就保证了线程对变量的可见性和排他性

  因为这个Synchronized关键字是由Java语言本身为我们提供的,所以习惯将Synchronized关键字称之为内置锁

对象锁:

  锁的是类的对象实例

类锁:

  锁的是每个类的Class对象,每个类的Class对象在一个虚拟机中只有一个,所以类锁也只有一个

package org.dance.day1.sync;

import org.dance.tools.SleepTools;

/**
 * 对象锁和类锁
 * @author ZYGisComputer
 */
public class SynClzAndInst {

    /**
     * 使用类锁的线程
     */
    private static class SynClass extends Thread{
        @Override
        public void run() {
            System.out.println("TestClass is running...");
            synClass();
        }
    }

    /**
     * 使用对象锁的线程
     */
    private static class InstanceSyn implements Runnable{
        private SynClzAndInst synClzAndInst;

        public InstanceSyn(SynClzAndInst synClzAndInst) {
            this.synClzAndInst = synClzAndInst;
        }

        @Override
        public void run() {
            System.out.println("TestInstance is running..."+synClzAndInst);
            synClzAndInst.instance();
        }
    }

    /**
     * 使用对象锁的线程
     */
    private static class Instance2Syn implements Runnable{
        private SynClzAndInst synClzAndInst;

        public Instance2Syn(SynClzAndInst synClzAndInst) {
            this.synClzAndInst = synClzAndInst;
        }
        @Override
        public void run() {
            System.out.println("TestInstance2 is running..."+synClzAndInst);
            synClzAndInst.instance2();
        }
    }

    /**
     * 锁对象
     */
    private synchronized void instance(){
        SleepTools.second(3);
        System.out.println("synInstance is going..."+this.toString());
        SleepTools.second(3);
        System.out.println("synInstance ended "+this.toString());
    }

    /**
     * 锁对象
     */
    private synchronized void instance2(){
        SleepTools.second(3);
        System.out.println("synInstance2 is going..."+this.toString());
        SleepTools.second(3);
        System.out.println("synInstance2 ended "+this.toString());
    }

    /**
     * 类锁,实际是锁类的class对象
     */
    private static synchronized void synClass(){
        SleepTools.second(1);
        System.out.println("synClass going...");
        SleepTools.second(1);
        System.out.println("synClass end");
    }

    public static void main(String[] args) {
        // 测试锁两个对象
//        testTwoObject();
        // 测试锁一个对象
//        testOneObject();
        // 测试类锁
        testClass();
        SleepTools.second(1);
    }

    /**
     * 对象锁
     * 因为是锁的两个对象 所以可以同时运行
     */
    public static void testTwoObject(){
        SynClzAndInst synClzAndInst = new SynClzAndInst();
        Thread t1 = new Thread(new InstanceSyn(synClzAndInst));
        SynClzAndInst synClzAndInst2 = new SynClzAndInst();
        Thread t2 = new Thread(new Instance2Syn(synClzAndInst2));
        t1.start();
        t2.start();
    }

    /**
     * 对象锁
     * 因为是锁的同一个对象 所以不可以同时运行
     */
    public static void testOneObject(){
        SynClzAndInst synClzAndInst = new SynClzAndInst();
        Thread t1 = new Thread(new InstanceSyn(synClzAndInst));
        Thread t2 = new Thread(new Instance2Syn(synClzAndInst));
        t1.start();
        t2.start();
    }
    /**
     * 类锁
     * 类锁锁的是虚拟机内存中的唯一一份的class镜像
     */
    public static void testClass(){
        SynClzAndInst synClzAndInst = new SynClzAndInst();
        Thread t1 = new Thread(new InstanceSyn(synClzAndInst));
        t1.start();
        SynClass synClass = new SynClass();
        synClass.start();
    }


}

作者:彼岸舞

时间:2020\09\15

内容关于:并发编程

本文来源于网络,只做技术分享,一概不负任何责任

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring security OAuth2.0认证授权学习第二天(基础概念-RBAC)

    如果某个角色可以访问某个功能,当某一天其他的另一个角色也可以访问了,那么代码就需要变化,

    彼岸舞
  • 显示锁

    本来打算写设计模式的,在周六日用了两天的时间全部看了一遍,但是写了一篇之后,发现,写的没有网上的好,感觉大家可能看不懂,所以打算继续写并发编程

    彼岸舞
  • IK分词器

    分词:即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库中或者索引库中的数据进行分词,然后进行一个匹配操作,默认的中文分...

    彼岸舞
  • 视频流媒体推流平台EasyRTMP-Android前置摄像头推流画面镜像问题解决

    RTMP推流,就是将直播内容推送到服务器的过程。我们团队也研发了相应视频流媒体推流平台,使用简单便捷,不少用户都在使用这款推流平台,通过手机就能将视频流推送到自...

    EasyNVR
  • django-debug-toolbar安装配置及使用

    django-debug-toolbar是一个非常方便的工具,可以深入了解代码的工作以及它花费多少时间。特别是它可以显示你的页面生成的所有SQL查询,以及每个人...

    菲宇
  • django-debug-toolbar的配置以及使用

    django,web开中,用django-debug-toolbar来调试请求的接口,无疑是完美至极。   可能本人,见识博浅,才说完美至极, 大神,表喷,抱拳...

    Wyc
  • Git 关联已有分支

    思考:这里的origin/dev中的origin必须这么写吗?还可以是其他名字吗?欢迎在评论区讨论鸭。

    grain先森
  • JavaScript如何实现UTF-16编码转换为UTF-8编码——utfx.js源码解析

    当你在前端需要通过二进制数据与服务端进行通信时,你可能会遇到二进制数据的编码问题。大部分服务端的字符串编码类型都为UTF-8,而JavaScript中字符串编码...

    黄Java
  • Android自定义View【实战教程】5⃣️---Canvas详解及代码绘制安卓机器人

    Android自定义View【实战教程】3⃣️—-Paint类、Path类以及PathEffect类详解

    先知先觉
  • Kubernetes系列学习文章 - 五种控制器(七)

    | 导语 K8S的控制器是非常重要的存在,每种控制器都处理不同的任务,它主要用来控制Pod的状态和行为。

    宝哥@devops运维

扫码关注云+社区

领取腾讯云代金券