首页 > 编程语言 >Java-线程-并发解决方案

Java-线程-并发解决方案

时间:2024-05-11 21:42:24浏览次数:27  
标签:Java synchronized void 并发 线程 public

0.背景

在[Java-线程-并发]这篇文章中,我们引入了并发场景下的一些问题,并在末尾给出了几种常见的解决方案。

1.方案

1.1 synchronized

synchronized 是Java中的一个关键字,用于提供同步机制,保证多线程环境下对共享资源的安全访问。

通过使用 synchronized,Java虚拟机(JVM)保证同一时间内只有一个线程可以执行被 synchronized 保护的代码块或方法。

1.2 ReentrantLock

ReentrantLock 是 java.util.concurrent 包提供的一个高级工具,提供与 synchronized 相似的同步功能,但增加了更多的灵活性。

它允许尝试锁定(tryLock),定时锁定以及中断等待锁的线程。

private final ReentrantLock lock = new ReentrantLock();

public void method() {
    lock.lock();
    try {
        // 访问或修改共享资源
    } finally {
        lock.unlock();
    }
}

1.3 Volatile

volatile 关键字确保了变量的可见性,通过禁止指令重排优化,使得一个线程修改的值对其他线程立即可见。

适用于一写多读的场景,但不适合作为原子性操作。

private volatile boolean flag = false;

public void reader() {
    if (flag) {
        // 执行某些操作
    }
}

public void writer() {
    flag = true;
}

1.4 原子变量

Java 的 java.util.concurrent.atomic 包提供了一系列的原子类,如 AtomicIntegerAtomicLong 等,用于无锁的线程安全编程。这些类利用 CAS(比较并交换)操作来实现线程安全的更新操作。

private final AtomicInteger count = new AtomicInteger(0);

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

1.5 并发集合

java.util.concurrent 包还提供了线程安全的集合类,如 ConcurrentHashMapCopyOnWriteArrayList 等,这些集合内部管理了相关的同步机制,提供了比传统同步集合更好的并发性能。

Concurrent译为并发

标签:Java,synchronized,void,并发,线程,public
From: https://www.cnblogs.com/yang37/p/18187194

相关文章

  • 爬虫多线程代码调试
    第一次调试fromthreadingimportThreadfromfake_useragentimportUserAgentimportrequestsfromtimeimportsleepforiinrange(1,11):url=f"https://www.hupu.com/home/v1/news?pageNo={i}&pageSize=50"headers={"User-......
  • ETLCloud中如何执行Java Bean脚本
    ETLCloud中如何执行Java Bean脚本在ETLCloud这一强大的数据集成和转换平台中,执行Java Bean脚本的能力为其增添了更多的灵活性和扩展性。Java Bean脚本不仅仅是一段简单的代码,而是一种强大的工具,可以帮助用户定制和优化数据处理的每一个环节。为了充分利用这一功能,您需要编写......
  • JAVA开发使用@JsonFormat注解,日期比实际日期少一天问题
    前言最近同事反馈一个问题,说是日期保存后未发生变化。刚开始以为是字段未对应或者是未保存成功,当我去进行排查的时候发现,发现数据保存没有问题。奇了怪了。问题现象库里日期数据保存正确,但是后台返回前台页面发现不正确。排查过程刚开始怀疑是数据未保存成功,经过测试发现数据......
  • JAVA LIST按照指定字段去重重复
    JAVAList按照指定字段去重重复List<TalentPlanStudentEntity>studentList=relatePlanStudentList.stream() .collect(Collectors.collectingAndThen(Collectors.toCollection( ()->newTreeSet<>(Comparator.comparing(TalentPlanStudentEntity::getUserId......
  • Java-线程-并发问题和ConcurrentHashMap
    0.背景在经典八股文中,我们会背:啊,hashmap是线程不安全的,concurrentHashMap是线程安全的。然后呢,又背:啊,为啥ConcurrentHashMap是安全的,因为加锁了。好好好,接着八股:啊,啥啥分段锁。本文,结合实际例子来进行分析,这他妈的到底是在叭叭啥。一切,从一个Hashmap的demo谈起。pu......
  • JavaScript 生成32位UUID
    functionuuid(){varlen=32;//32长度varradix=16;//16进制varchars='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');varuuid=[],i;radix=radix||chars.length;if(......
  • C#实现多线程的几种方式
    思维导航前言多线程常用场景什么是进程?什么是线程?使用Thread类使用ThreadPool类使用Task类使用Parallel类拾遗补漏合集DotNetGuide技术社区交流群前言多线程是C#中一个重要的概念,多线程指的是在同一进程中同时运行多个线程的机制。多线程适用于需要提......
  • m2_day06 [线程池]
    课程内容:线程池的概念线程池的种类自定义线程池执行器线程池启动线程线程池的概念线程池:所谓线程池是一种标准的资源池模式​资源池模式就是在用户出现之前提前预留活跃资源从而在用户出现的第一时间直接满足用户对资源的需求并且将资源的新建......
  • JavaScript 原型链与继承问答(第一天)
    1、在编程语言中,什么叫语法糖在编程语言中,"语法糖"是指一种编程语言的语法功能,它并不改变语言的功能,但可以让代码更易读、更易写。它是一种语法上的简化,让程序员能够用更少的代码表达相同的逻辑。比如es6中,一个对象想复用另外一个对象的所有字段,可以这样constobj2={...obj......
  • 线程安全队列(使用互斥锁进行实现)
    线程安全队列(使用互斥锁进行实现)没有设置队列上限的线程安全队列只需要采取一个std::condition_variable变量,用于处理队列为空的情况以下是示例代码,涉及了std::mutex和std::condition_variable、std::unique_lock、std::lockguard等多线程交互的类。测试方式采取的是3个生成者......