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

yizhihongxing

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日

相关文章

  • 详解springboot集成mybatis xml方式

    接下来我将详细讲解关于“详解Spring Boot集成MyBatis XML方式”的攻略。 1. 添加相关依赖 在pom.xml中添加以下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-st…

    Java 2023年5月20日
    00
  • Java实现FTP文件上传

    关于Java实现FTP文件上传,我可以给出一份完整攻略,步骤如下: 步骤一:引入FTP客户端jar包 在Java项目的pom.xml文件中添加以下依赖,引入FTP客户端jar包: <dependency> <groupId>commons-net</groupId> <artifactId>commons-ne…

    Java 2023年5月19日
    00
  • SpringMVC实现Controller的三种方式总结

    以下是关于“SpringMVC实现Controller的三种方式总结”的完整攻略,其中包含两个示例。 SpringMVC实现Controller的三种方式总结 SpringMVC是一个基于Java的Web框架,它可以帮助我们快速开发Web应用程序。Controller是SpringMVC中的一个组件,它用于处理HTTP请求。本文将介绍SpringMVC实现C…

    Java 2023年5月17日
    00
  • Java中session存储Users对象实现记住密码

    当我们使用Java web开发时,常使用session来存储用户的信息以便在整个会话期间使用。如果想要实现记住密码功能,则需要将用户的用户名与密码存储在session对象中,并设置session的有效时间。下面是实现过程的完整攻略。 第一步:创建一个登录页面 首先我们需要创建一个登录页面,该页面包含一个用户名和密码的输入框以及一个“记住密码”的复选框。当用户…

    Java 2023年5月20日
    00
  • jsp中sitemesh修改tagRule技术分享

    下面我将详细讲解“JSP中Sitemesh修改tagRule技术分享”的完整攻略。 简介 Sitemesh是一款用于Web页面装饰的框架,可以将公共的页面模板与动态生成的内容进行分离。在使用Sitemesh的过程中,可以通过修改tagRule来自定义标签的使用规则,并且可以根据需求进行灵活调整。 修改tagRule的步骤 1. 创建自定义的tagRule 在…

    Java 2023年6月15日
    00
  • 详解如何将JAVA程序制作成可以直接执行的exe文件

    当我们开发了一个 Java 程序后,要想方便地给其他人使用,就需要将其制作成可执行的 exe 文件。下面是将 Java 程序制作成 exe 文件的详细攻略。 1. 概述 制作 Java 可执行文件的方式主要有两种,一种是使用打包软件,如 JSmooth、Launch4j 等,另一种是使用安装包制作工具,如 InstallShield、Inno Setup 等…

    Java 2023年5月19日
    00
  • Java异常处理的机制是什么?

    Java异常处理机制是一种处理程序错误的方式。在Java程序运行时,如果程序出现错误(如除0、数组下标越界等),程序会抛出一个异常对象。此时,Java会尝试查找能够处理该异常的异常处理程序,若找到则执行该处理程序,若没有找到则程序终止并输出堆栈跟踪信息。 Java异常处理机制主要分为异常抛出、异常捕获和异常处理三个部分。 1.异常抛出 在Java中,异常是以…

    Java 2023年4月27日
    00
  • SpringMVC基于注解方式实现上传下载

    SpringMVC基于注解方式实现上传下载 SpringMVC是一种基于Java的Web框架,它可以帮助我们快速地开发Web用程序。本文将详细介绍如何使用SpringMVC基于注解方式实现上传下载,并提供两个示例说明。 上传文件 在SpringMVC中,我们可以使用MultipartFile类来处理上传的文件。以下是一个上传文件的示例。 步骤1:配置web.…

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