首页 > 编程语言 >Java并发编程:面向对象思想与并发编程思想的融合

Java并发编程:面向对象思想与并发编程思想的融合

时间:2023-11-27 23:56:21浏览次数:37  
标签:Java 变量 val int 编程 并发 共享 public

1. 封装共享变量

1.1 识别可变化与不变的共享变量

识别可变化与不可变化的共享变量。
针对初始化后不再改变的变量,可以添加final修饰。不仅编译器编译更快,也对后续开发人员指明了变量属性,更防范了意想不到的修改行为。

1.2 针对可变化的共享变量,进行封装处理

针对共享变量的访问,若是没有统一的入口,很容易造成并发问题。正好,面向对象思想有"封装"这一概念,正好可以将共享变量作为私有属性,而开放公共方法作为访问共享变量的入口。

如针对count变量的访问。

Class Count {

  private int cnt;

  public synchronized int get() {
    return cnt;
  }

  public synchronized int add() {
    cnt++;
  }

}

2. 识别约束条件

共享变量之间的约束条件,反映在代码里基本上都会有if语句

假设一个产品有最低价与最高价,且最高价必须大于最低价。当前setLow()及setUp()方法的实现都使用了原子类进行获取值并判断,是否还存在问题?
当前setLow()及setUp()方法其实存在竞态条件。假设当前最低价1元,最高价4元,现在线程AB同时分别修改最低价为3元,最高价为2元,也是可以修改成功的。这个约束条件实际上是没有识别并拦截的。
使用了原子类只保证了low与up各自的并发安全,并没有保证最高价必须大于最低价,因为获取另外一个值并进行比较的操作并非原子操作。

Class Product {
    private final AtomicInteger low = new AtomicInteger(0);

    private final AtomicInteger up = new AtomicInteger(0);

    public void setLow(int val) {
        if (val > up.get()) {
            throw new IllegalArgumentException();
        }
        low.set(val);
    }

    public void setUp(int val) {
        if (val < low.get()) {
            throw new IllegalArgumentException();
        }
        up.set(val);
    }
}

正确的修改应该对setLow()及setUp()的代码进行加锁。

3. 制定并发访问策略

常见的并发设计思路:

  • 避免共享
  • 不变模式
  • 管程及其他同步工具

标签:Java,变量,val,int,编程,并发,共享,public
From: https://www.cnblogs.com/kiper/p/17860335.html

相关文章

  • Java实现并行功能
    Java8线程池异步处理-->针对小包大MyTask 类中的 compute() 方法首先检查任务的规模是否小于等于1。如果是,它直接返回任务的结果。否则,它将任务拆分成两个子任务(leftTask 和 rightTask),并使用 fork() 方法将它们提交到 ForkJoinPool 中执行。这里定义了一个名为 My......
  • java System
    packagenet.elaina.system;publicclassTest1{publicstaticvoidmain(String[]args){/*publicstaticvoidexit(intstatus)终止当前运行的Java虚拟机publicstaticlongcurrentTimeMillis()返回当前系统的时间毫秒值形式p......
  • 支持修改键值的优先队列(以C++,Java为例)
    #include<queue>#include<functional>template<typenameT1,typenameT2>classmutable_priority_queue;template<typenameT1,typenameT2>classmutable_priority_queue{private:std::function<bool(conststd::pair<T1,T......
  • Java的Buffer流输入封装类
    importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.util.StringTokenizer;classQuickReader{privatefinalBufferedReaderbufferedReader=newBufferedReader(newInputStreamReader(System.in));......
  • 八股文-Java方法的重载与重写
    在Java中,重载和重写是两个关键的面向对象编程概念。重载通过方法的参数列表不同来区分同名方法,提供了更灵活的方法调用方式。而重写通过子类重新定义父类中已经存在的方法,实现了多态性的体现,让代码更具可扩展性和维护性。重载(Overloading)重载是指在同一个类中可以定义多个方法......
  • Java换行输出
    Java换行输出的五种方法第一种:(println)System.out.print("#123");System.out.pritn("$123");//print--不会换行输出输出#123$123System.out.print("#123");System.out.println("$123");//println--输出时直接换行或者System.out.println("$123&......
  • JavaSE练习,JDBC驱动,基于swing库的带登录功能计算器
    一、前言本次作业是基于上次的计算器功能所做的改进,通过JDBC连接MySQL增加了登录与注册功能,并对计算器所作的运算进行了记录。虽然基于上次的作业所作,但是设计编写的模块大部分与之无关(登录注册自然与计算器无关)。所以本次作业属于再开发而不是运营维护。二、概要设计......
  • LeetCode-Java:27.移除元素
    题目给你一个数组nums和一个值val,你需要原地移除所有数值等于val的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用O(1)额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。说明:为什么返回数值是整数......
  • LeetCode-Java:80.删除有序数组中的重复项 II
    题目给你一个有序数组nums,请你原地删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成。说明:为什么返回数值是整数,但输出的答案是数组呢?请注意,输入......
  • LeetCode-Java:26.删除有序数组的重复项
    题目给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k,你需要做以下事情确保你的题解可以被通过:更改数组......