首页 > 编程语言 >第三百二十二节 Java线程教程 - Java原子变量、Java显式锁

第三百二十二节 Java线程教程 - Java原子变量、Java显式锁

时间:2024-11-13 10:46:07浏览次数:3  
标签:Java Lock value util concurrent 线程 显式 java public

Java线程教程 - Java原子变量

新线程并发包

java.util.concurrent和java.util.concurrent.atomic和java.util.concurrent.locks包括非常有用的并发构造。

线程并发包以四种方式支持并发。

  • 原子变量
  • 同步器
  • 并发集合

原子变量

原子变量类的命名类似于AtomicXxx,例如,AtomicInteger类用于表示一个int变量。

原子变量可用于在不使用任何锁的情况下以原子方式对单个变量执行多个指令。

  • 标量原子变量类

    AtomicInteger,AtomicLong和AtomicBoolean类分别支持对原始数据类型int,long和boolean的操作。

    当引用变量需要以原子方式更新时,AtomicReference类用于处理引用数据类型。

  • 原子数组类

    有三个类称为AtomicIntegerArray,AtomicLongArray和AtomicReferenceArray,它们表示一个int,long和引用类型的数组,其元素可以进行原子性更新。

  • 原子字段更新程序类

    有三个类称为AtomicLongFieldUpdater,AtomicIntegerFieldUpdater和AtomicReferenceFieldUpdater,可用于使用反射以原子方式更新类的易失性字段。

    要获得对这些类的对象的引用,您需要使用他们的工厂方法newUpdater()。

  • 原子复合变量类

例子

以下代码显示如何使用AtomicLong类来创建计数器。

import java.util.concurrent.atomic.AtomicLong;

public class AtomicCounter {
  private AtomicLong value = new AtomicLong(0L);

  public long next() {
    return value.incrementAndGet();
  }
}

Java线程教程 - Java显式锁

显式锁定机制可以用于协调对多线程环境中的共享资源的访问。

在java.util.concurrent.locks包中声明的Lock接口定义了显式锁定操作。

ReentrantLock类在同一个包中,是Lock接口的具体实现。

Lock接口声明如下:

public interface Lock {
  void lock();

  Condition newCondition();

  void lockInterruptibly() throws InterruptedException;

  boolean tryLock();

  boolean tryLock(long time, TimeUnit unit) throws InterruptedException;

  void unlock();
}

lock()方法获取一个锁的行为与使用synchronized关键字相同。

我们必须在完成锁定后通过调用Lock接口的unlock()方法释放锁定。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

public class Main {
  // Instantiate the lock object
  private Lock myLock = new ReentrantLock();

  public void updateResource() {

    try {
      // Acquire the lock
      myLock.lock();
    } finally {
      // Release the lock
      myLock.unlock();
    }
  }
}

例子

下面的代码模拟哲学家,假设ReentrantLock类的一个对象表示一个fork。

import java.util.concurrent.locks.Lock;

class Philosopher {
  private Lock leftFork;
  private Lock rightFork;
  private String name; // Philosopher"s name

  public Philosopher(Lock leftFork, Lock rightFork, String name) {
    this.leftFork = leftFork;
    this.rightFork = rightFork;
    this.name = name;
  }

  public void think() {
    System.out.println(name + "  is thinking...");
  }

  public void eat() {
    if (leftFork.tryLock()) {
      try {
        if (rightFork.tryLock()) {
          try {
            System.out.println(name + "  is eating...");
          } finally {
            rightFork.unlock();
          }
        }
      } finally {
        leftFork.unlock();
      }
    }
  }
}

例2

ReentrantReadWriteLock类是ReadWriteLock接口的实现。只有一个线程可以保持ReentrantReadWriteLock的写锁,而多个线程可以保持其读锁。

下面的代码演示了ReentrantReadWriteLock的用法。

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class Main {
  private int value;
  private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
  private Lock rLock = rwLock.readLock();
  private Lock wLock = rwLock.writeLock();

  public Main(int value) {
    this.value = value;
  }

  public int getValue() {
    rLock.lock();
    try {
      return this.value;
    } finally {
      rLock.unlock();
    }
  }

  public void setValue(int value) {
    wLock.lock();
    try {
      this.value = value;
    } finally {
      wLock.unlock();
    }
  }
}

标签:Java,Lock,value,util,concurrent,线程,显式,java,public
From: https://blog.csdn.net/2301_78772942/article/details/143733845

相关文章

  • 第三百二十三节 Java线程教程 - Java同步器
    Java线程教程-Java同步器同步器对象与一组线程一起使用。它维护一个状态,根据它的状态,它让一个线程通过或强迫它等待。本节将讨论四种类型的同步器:SemaphoresBarriersLatchesExchangers信号量信号量用于控制可以访问资源的线程数。java.util.concurrent包中的Semaphor......
  • 番外-JDBC:2024年最新java连接数据库教程
    前言JavaScript的内容晚点更新,今天继续更新一点番外,今天更新的是jdbc,如何用java连接数据库1.导包要使java能够连接数据库我们需要导入一个包,请按照以下操作安装并导包1.进入官网MySQL以上为官网链接进去后点击下载继续按图片点击 根据自己使用的语言选择,这里演示的......
  • Java设计模式--单例模式(懒汉式实现)
    1、单例模式(SingletonPattern)    单例模式是一种常见的设计模式,目的是确保一个类只会存在一个实例,并且该类提供全局进行访问此实例的方法。2、懒汉式/***@authorHao*单例模式:懒汉式*懒汉式是线程不安全的,懒汉式在多线程环境下,可能会出现多个实例,所以需......
  • 在 Java 中,什么时候用重载,什么时候用重写
     重载概念:重载是在同一个类中,有多个同名的方法,但参数类型、数量或顺序不同。目的:提供多种方式调用同一名称的方法,以适应不同的场景。应用:当需要以统一的方式来处理不同类型的数据时,可以用重载。重写概念:重写发生在继承关系中,子类重新定义父类的方法。目的:子......
  • 在 Java 中,什么时候用重载,什么时候用重写
      重载概念:重载是在同一个类中,有多个同名的方法,但参数类型、数量或顺序不同。目的:提供多种方式调用同一名称的方法,以适应不同的场景。应用:当需要以统一的方式来处理不同类型的数据时,可以用重载。重写概念:重写发生在继承关系中,子类重新定义父类的方法。目的:......
  • 基于Java的高校实习信息发布系统
    高校实习信息发布系统一:基本介绍开发环境功能模块图系统功能部分数据库表设计二:部分系统页面展示登录页面网站首页查看企业信息查看实习职位信息查看个人简历信息用户交流论坛管理职位实习列表页面公告信息管理页面企业管理页面源码一:基本介绍开发环境·开发语......
  • 探索jQuery与原生JavaScript:事件绑定的比较
    探索jQuery与原生JavaScript:事件绑定的比较在现代网页开发中,事件处理是实现用户交互的关键部分。开发者可以选择使用原生JavaScript或jQuery来绑定事件。本文将通过一个简单的示例,比较这两种方法在事件绑定上的不同,并探讨它们的优缺点。事件绑定基础事件绑定是将事件监听......
  • flask基于JavaWeb的网上订餐系统设计与实现(毕设源码+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于网上订餐系统的研究,现有研究主要集中在系统的基本功能实现以及用户体验优化方面,如界面设计、订单流程简化等。专门针对订餐系统中......
  • 工作学习笔记(七)Java的接口
    今天复习一下Java的基础知识,之前对于接口只有一个比较笼统的概念,经过一晚上的梳理,整理如下:它一种抽象类型,用于定义一组方法和常量。是Java多态性的重要体现。定义接口使用 interface 关键字来定义,例如 publicinterfaceMyInterface{} 。接口中的成员变量默认是 public......
  • 【java编程】深入揭秘 Java 中 Person person = new Person(); 背后的奥秘
    当你在Java中写下Personperson=newPerson();时,这行代码看似简单,却蕴藏着深奥的计算机科学原理,甚至能揭示Java内存管理的神秘面纱。每当你创建一个对象,你实际上是在与Java的内核进行一场交互。今天,我们就来一起揭开这行代码的面纱,探索Java的对象创建机制,理解它是如何......