Java对象级别与类级别的同步锁synchronized语法示例

Java中的synchronized关键字提供了一种在多线程情况下同步访问共享资源的机制。synchronized关键字有两种用法:对象级别的同步和类级别的同步。

对象级别的同步锁

对象级别的同步锁可以保证同一时刻只有一个线程能够访问该对象的synchronized方法或代码块。对象级别的同步锁可以使用对象的实例作为锁,即synchronized(obj){...}

例如:

public class Counter {
    private int count = 0;

    public synchronized void increment() {
        count++;
    }

    public synchronized int getCount() {
        return count;
    }
}

上述代码中,increment()getCount()方法都加上了synchronized关键字,因此在方法内部访问count变量时,会获得当前对象的锁。这样一来,即使多个线程同时调用Counter对象的方法,也只有一个线程能够访问count变量。

类级别的同步锁

类级别的同步锁是在类加载时对整个类加锁,即同一时刻只能有一个线程能够访问该类的synchronized方法或代码块。类级别的同步锁可以使用class对象作为锁,即synchronized(Counter.class){...}

例如:

public class Counter {
    private static int count = 0;

    public static synchronized void increment() {
        count++;
    }

    public static synchronized int getCount() {
        return count;
    }
}

上述代码中,increment()getCount()方法都加上了synchronized关键字,并且都使用了class对象作为锁,因此在方法内部访问count变量时,会获得Counter.class的锁。这样一来,即使多个线程同时调用Counter类的静态方法,也只有一个线程能够访问count变量。

以上是Java对象级别与类级别的同步锁synchronized语法示例的完整攻略,下面是两条用例说明:

示例一

public class Test {
    public static void main(String[] args) {
        final Counter counter = new Counter();

        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                counter.increment();
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                counter.increment();
            }
        });

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(counter.getCount());
    }
}

上述代码中,Test类创建了两个线程,分别对Counter对象的increment方法进行10次累加。由于increment方法使用了对象级别的同步锁,因此同一时刻只有一个线程能够访问Counter对象的increment方法。程序最终输出结果为20。

示例二

public class Test {
    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                Counter.increment();
            }
        });

        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 10; i++) {
                Counter.increment();
            }
        });

        t1.start();
        t2.start();

        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println(Counter.getCount());
    }
}

上述代码中,Test类创建了两个线程,分别对Counter类的静态方法increment进行10次累加。由于increment方法使用了类级别的同步锁,因此同一时刻只有一个线程能够访问Counter类的increment方法。程序最终输出结果为20。

以上就是Java对象级别与类级别的同步锁synchronized语法示例的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java对象级别与类级别的同步锁synchronized语法示例 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • vue + element-ui的分页问题实现

    下面是“vue + element-ui的分页问题实现”的完整攻略,包含以下几个部分: 安装element-ui和配置Vue组件 Element-ui分页组件的使用 分页数据处理及传参方式说明 1. 安装element-ui和配置Vue组件 1.1 安装element-ui 首先需要在你的项目中安装 element-ui,使用如下命令进行安装: npm in…

    Java 2023年6月16日
    00
  • Java开启/关闭tomcat服务器的方法

    下面是Java开启/关闭tomcat服务器的方法的完整攻略: 确认Tomcat安装目录 在进行Tomcat服务器的开启和关闭前,我们要先确认Tomcat的安装目录。通常情况下,Tomcat会默认安装在/usr/local/tomcat目录下。如果您的Tomcat安装目录与该路径不同,需要将其替换为正确的目录。 开启Tomcat服务器 我们可以通过以下步骤开启…

    Java 2023年5月19日
    00
  • 解决IDEA无法下载maven依赖的问题

    关于“解决IDEA无法下载maven依赖的问题”的完整攻略,以下是我整理的步骤: 1. 检查Maven仓库的配置是否正确 首先检查是否配置了正确的Maven仓库设置。可以在Windows环境下检查%USERPROFILE%/.m2/settings.xml文件或在Linux/Max OS X下检查~/.m2/settings.xml文件。 在settings…

    Java 2023年5月20日
    00
  • Springboot配置返回日期格式化五种方法详解

    Springboot配置返回日期格式化五种方法详解 在Springboot开发中,经常会用到日期格式化,在处理时间日期类型的数据比较麻烦,需要对日期实现格式化。本文将从不同的维度,介绍五种Springboot配置返回日期格式化的方法。 1. 使用@JsonFormat注解实现格式化 使用Spring的@JsonFormat注解来实现日期的格式化输出,它可以放…

    Java 2023年5月20日
    00
  • 深入了解JAVA数据类型与运算符

    深入了解JAVA数据类型与运算符 JAVA数据类型 JAVA中的数据类型分为两类,基本数据类型和引用数据类型。 基本数据类型 JAVA的基本数据类型包括以下8种: byte:1字节,范围-128~127 short:2字节,范围-32768~32767 int:4字节,范围-2147483648~2147483647 long:8字节,范围-92233720…

    Java 2023年5月26日
    00
  • Java连接mysql数据库代码实例程序

    这里提供的完整攻略将帮助大家编写Java连接mysql数据库的代码实例程序。 步骤一:下载并安装JDBC驱动程序 在使用Java连接mysql数据库之前,我们需要下载并安装mysql JDBC驱动程序。这里我们以mysql-connector-java-8.0.25.jar为例,在这个网页上下载mysql JDBC驱动程序:https://dev.mysql…

    Java 2023年6月16日
    00
  • 使用springboot打包成zip部署,并实现优雅停机

    使用springboot打包成zip部署可以方便地将应用程序部署到任何环境中。配合优雅停机功能可以在应用程序需要停止运行时,平滑地关闭运行中的所有任务,确保应用程序不会因为意外关机而出现问题。下面是实现这一目标的完整攻略。 准备工作 在开始之前,需要先准备好以下环境和工具:- JDK 1.8 或以上版本- Maven 3.3 或以上版本- SpringBoo…

    Java 2023年5月20日
    00
  • 浅谈Springboot实现拦截器的两种方式

    下面我来详细讲解“浅谈Springboot实现拦截器的两种方式”。 一、背景 在Springboot应用中,拦截器(或者称为过滤器、中间件)是常用的功能模块之一,可以用于对请求进行预处理、后处理、权限控制、日志记录等操作。在本文中,我将介绍两种Springboot实现拦截器的方式。这两种方式分别是基于配置文件的拦截器实现和基于注解的拦截器实现。 二、基于配置…

    Java 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部