首页 > 编程语言 >JAVA JVM 层面的锁

JAVA JVM 层面的锁

时间:2023-06-16 20:11:51浏览次数:34  
标签:cnt JAVA 层面 synchronized Thread INSTANCE thread 线程 JVM

JVM 锁

1、JAVA 为了实现在多线程环境灰姑娘下的线程安全,提供了诸如 synchronized , ReentrantLock 等工具类来解决我们在多线程环境下的线程安全问题。

synchronized 锁

1、上面是 synchronized锁
synchronized是Java中的关键字,是一种同步锁。它修饰的对象有以下几种:

  1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
  2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
  3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
  4. 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。

线程不安全的实例

public class UnSafeExample {

    // frequency
    private static final int FREQUENCY = 20;

    public static void main(String[] args) throws InterruptedException {

        Thread thread = new Thread(Performance.INSTANCE , "thread-1");
        Thread thread1 = new Thread(Performance.INSTANCE , "thread-2");
        thread.start();
        thread1.start();

        try {
            // 等待两个线程都运行结束后,再打印结果
            thread.join();
            thread1.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(Performance.INSTANCE.cnt);

    }

    enum Performance implements Runnable {

        INSTANCE;

        int cnt = 0;

        @Override
        public void run() {
            for (int i = 0 ; i < FREQUENCY ; ++i) {
                cnt ++ ;
            }
        }
    }
    
}

1、我们通过 Thread开启了两个线程每个线程的run方法执行 20 次cnt ++ 操作,但是实际上当两个线程执行完之后我们发现assertEquals(cnt , 40)等于false2、在并发环境下cnt ++这个操作并不是一个原子性操作,他包含三条指令:读值、+1、写值 3、通过join方法我们可以实现对thread1thread2线程的阻塞等价于countdownlatch`

synchronized 锁的使用

public class SafeExample {

    // frequency
    private static final int FREQUENCY = 20;

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(Performance.INSTANCE , "thread-1");
        Thread thread1 = new Thread(Performance.INSTANCE , "thread-2");
        thread.start();
        thread1.start();

        // 模拟延迟
        Thread.sleep(100);
        System.out.println(Performance.INSTANCE.cnt);
    }

     enum Performance implements Runnable {

        // 单例对象
        INSTANCE;

         /**
          *  1、使用枚举类 INSTANCE 设计单例模式
          *  2、使用 volatile 对属性进行修饰---确保多线程环境下的可见性
          */
         volatile int cnt = 0;

        @Override
        public synchronized void run() {
            for (int i = 0 ; i < FREQUENCY ; ++i) {
                cnt ++ ;
            }
        }
    }

}

1、synchronized 修饰方法锁的是当前对象
2、synchronized 修饰代码块锁的是 synchronized(this) 对象
3、synchronized 所锁的是 Class 对象相当于多个该对象的实例
4、volatile 关键字保证了属性的可见性

标签:cnt,JAVA,层面,synchronized,Thread,INSTANCE,thread,线程,JVM
From: https://www.cnblogs.com/ayizzz/p/17486432.html

相关文章

  • javaScript核心知识点
      一、JavaScript简介       一、JavaScript语言的介绍:JavaScript是基于对象和原型的一种动态、弱类型的脚本语言       二、JavaScript语言的组成:JavaScript是由核心语法(ECMAScript)、文档对象模型(DOM)、浏览器对象模型(BOM)组成的       三......
  • Chrome 禁用 javascript
    步骤1.打开控制台:右键>检查2.在控制台页面快捷键ctrl+shift+p然后输入javascript找到disabledjavaScript.解除禁用: ctrl+shift+p然后输入enablejavaScript找到enablejavaScrip. ......
  • java中xml和json转换
    packagecom.lbdz.bsf.util;importnet.sf.json.JSONObject;importnet.sf.json.JSONSerializer;importnet.sf.json.xml.XMLSerializer;/***xml和json转换*/publicclassXMLUtils{/***xml转化为字符串*@paramxml*@returnstr......
  • centOS下解决java生成图片中文乱码问题
    今天测试项目上线,其中有这样一个功能点:上传ppt转为图片。但是却出现了乱码,刚开始怀疑是系统编码的问题,但是:echo$LANG发现是utf-8,好像没什么问题,继续查找程序中的日志信息,发现从ppt中取出来的内容没有乱码,查看代码发现是生成图片时使用宋体字,猜测是字体没有安装。于是通过:fc-l......
  • 2、【java程序运行监控byteman】使用示例(运行中方法耗时监控、javaagent监控、jvm监控
    (文章目录)本文介绍了byteman的其他几种应用场景及示例,比如javaagent、监控jvm、bmjava命令、如何查看运行的规则、检查规则的正确性、检查规则是否在运行中等。本文分为2个部分,即运行中方法耗时监控和其他示例。一、统计方法耗时(程序运行中)该类是实时显示控制台输入的结果以......
  • java开发手记
    1.把json数据封装成一个对象接收,需要前面加上一个注解 @RequestBosy @PutMating //修改操作publicResult update(@RequestBodyEmp emp){} 2.按住alt键+鼠标左键向下拖动,可以同时选取编辑多行 3.springboot配置文件 application.yml数据格式(值和冒号之间必须......
  • 7个必备JavaScript优化技巧,CodeGeeX 5秒搞定了!
    JavaScript,目前成了使用最广泛的编程语言。这篇文章给出的是一些JavaScript的优化技巧,这些技巧帮助开发者编写出更好的代码。当写完这些代码段之后,我突然意识到,所有的这些代码段,由于它们的常用性,非常适合用AI辅助编程工具CodeGeeX来自动生成。下载使用——CodeGeeX插件,在VSCode......
  • java 中怎么修改文本中的内容
    在Java中,你可以使用字符串的各种方法来修改文本中的内容。下面是几个常见的方法:使用replace方法:该方法用于将字符串中指定的字符或字符串替换为新的字符或字符串。例如:Stringtext="Hello,world!";StringmodifiedText=text.replace("world","Java");System.out.println(mo......
  • java 中怎么修改文本中的内容
    在Java中,你可以使用字符串的各种方法来修改文本中的内容。下面是几个常见的方法:使用replace方法:该方法用于将字符串中指定的字符或字符串替换为新的字符或字符串。例如:Stringtext="Hello,world!";StringmodifiedText=text.replace("world","Java");System.out.println(mo......
  • Intellij IDEA_Intellij IDEA下载「Java开发」软件大全
    IntelliJIDEA软件简介IntellijIDEA是一个综合性的Java编程环境,最突出的功能自然是调试(Debug),可以对Java代码,JavaScript,JQuery,Ajax等技术进行调试。IntellijIDEA把Java开发人员从一些耗时的常规工作中解放出来,显著地提高了开发效率。分别是它的WINDOWS、LINUX版本。[下载地址]:后......