并发三大特性:原子性、可见性、有序性

一、原子性

原子性是指一个操作是不可中断的整体,要么全部执行成功,要么全部执行失败。在多线程环境下,原子性是保证数据正确的基础。

Java提供了synchronized关键字和java.util.concurrent.atomic包下的原子类来实现原子操作。

public class Counter {
    private int count = 0;

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

    public int getCount() {
        return count;
    }
}

在上面的代码中,通过synchronized关键字使increment方法变成原子操作,从而保证了count的正确性。

除此之外,还可以使用AtomicInteger这个原子类来实现计数器:

public class Counter {
    private AtomicInteger count = new AtomicInteger();

    public void increment() {
        count.incrementAndGet();
    }

    public int getCount() {
        return count.get();
    }
}

二、可见性

可见性是指当一个线程修改了共享变量时,另一个线程能够立即看到这个修改。在多线程环境下,可见性是保证数据一致性的基础。

Java提供了volatile关键字来实现可见性,它能够保证在读取和修改变量时,都是直接从内存中读取和写入,而不是从缓存中读取和写入。

public class Counter {
    private volatile int count = 0;

    public void increment() {
        count++;
    }

    public int getCount() {
        return count;
    }
}

三、有序性

有序性是指程序执行的顺序与代码的先后顺序一致,Java中的指令重排可能会导致代码执行的顺序不一致,从而产生一系列问题。

Java提供了synchronized和volatile两种方式来保证有序性。

在下面的例子中,线程A和线程B执行的结果可能会不同:

public class OrderExample {
    private int x = 0;
    private boolean flag = false;

    public void write() {
        x = 1;
        flag = true;
    }

    public void read() {
        if (flag) {
            int y = x + 1;
        }
    }
}

在上面的代码中,如果线程A先执行write方法,然后线程B执行read方法,在没有任何同步措施的情况下,y可能为0而不是2。

使用volatile关键字可以避免指令重排:

public class OrderExample {
    private volatile int x = 0;
    private volatile boolean flag = false;

    public void write() {
        x = 1;
        flag = true;
    }

    public void read() {
        if (flag) {
            int y = x + 1;
        }
    }
}

结语

并发编程是一个复杂的问题,掌握并发三大特性对于正确使用多线程至关重要。

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/231918.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2024-12-11 01:08
下一篇 2024-12-11 01:08

相关推荐

  • Python计算机语言的特性与应用

    Python,是一种高层次、解释型的、面向对象的计算机编程语言。 一、简介 Python编程语言的初衷是:代码简洁易读、可拓展性强、适用范围广。其应用领域包括Web开发、数据科学、…

    编程 2025-04-29
  • Python三大:NumPy、Pandas、matplotlib

    本文将详细介绍三大Python数据处理及可视化库——NumPy、Pandas以及matplotlib,为读者提供从基础使用到应用场景的全面掌握。 一、NumPy NumPy是Pyt…

    编程 2025-04-27
  • Python列表的特性

    Python列表是一种能够保存任意对象的动态数组结构。Python列表具有以下特性: 一、可变性 Python列表是可变的,可以动态改变其元素。可以通过索引来访问和修改列表中的元素…

    编程 2025-04-27
  • Java8特性详解

    Java8是Java语言的一个重要版本。有很多新的特性被加入,比如Lambda表达式、方法引用、Stream API等。这些特性提供了更为一致、紧凑的代码风格和更好的可读性,使得J…

    编程 2025-04-25
  • Java 14:新的特性和改进

    一、Records Java 14中引入了Records,这是一种新的类声明,用于声明轻量、不可变值类。Records类似于传统Java类,但通过简化声明,目的是更容易地定义数据聚…

    编程 2025-04-25
  • Java 8特性详解

    一、Lambda表达式 1、Lambda表达式是Java 8中最大的特性之一,它提供了一种简洁的方式来写匿名内部类。Java 8中,Lambda表达式的格式为(parameters…

    编程 2025-04-23
  • 面向对象的三大特性

    一、封装性 封装是面向对象的核心思想之一,指将数据与对其进行操作的方法(或称为函数)封装在一起,成为一个“类”(Class)。通过封装,可以达到隐藏数据、保护数据、使代码易于理解和…

    编程 2025-04-13
  • 全面解析lskypro的开发特性

    一、简介 lskypro是一款集成了多种现代化技术的软件平台,拥有全面的功能和灵活的开发特性。它可以帮助开发者更高效地开发应用程序,缩短开发周期,提高开发质量。下面将从多个方面介绍…

    编程 2025-04-13
  • 浅谈Stylex插件的使用与特性

    一、简介 Stylex是一个VS Code扩展,它可以帮助你在CSS样式表中轻松地编写和维护变量(例如颜色、字体、间距等)。 与其他CSS预处理器不同,Stylex不需要任何外部编…

    编程 2025-04-12
  • InnoDB引擎的四大特性

    InnoDB引擎是MySQL数据库中比较流行的一个存储引擎,它具有四大特性:ACID事务、行级锁、MVCC多版本并发控制、可靠性架构。本文将从多个方面对这四大特性进行详细阐述。 一…

    编程 2025-02-24

发表回复

登录后才能评论