`
annan211
  • 浏览: 448145 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

java 多线程 原子操作(一)

阅读更多
对于一个集合 需要在加入之前 执行“先检查后执行”的步骤以达到“若没有则添加,若有则不添加”的目的,实行多线程以提高效率。

@NotThreadSafe
public class ListHelper<E>{
	public List<E> list = 
	     Collections.synchronizedList(new ArrayList<E>());

	public synchronized boolean putIfAbsent(E x){
		boolean absent = !list.contains(x);
		if(absent)
		     list.add(x);
		  return absent;
	}
}


可惜的是这段代码并不能保证能够正确的完成工作,这是为什么呢?集合和动作都已经被synchronized修饰。问题在于在错误的锁上使用了同步,无论list使用哪一个锁来保护她的状态,可以肯定的是这个锁并不是 ListHelper的锁,ListHelper只是试用了同步的假象,尽管所有的链表操作都被生命为synchronised ,但却试用了不同的锁,这就意味着putIfAbsent相对于list的其他操作并不是原子的,因此就无法确保当putIfAbsent执行时另一个线程就不会修改链表。
  要想使这个方法正确执行,必须使list在实现客户端加锁和或外部加锁时使用同一个锁,
客户端加锁是指 对于使用某个对象X的客户端代码,使用X对象本身用于保护其状态的锁来保护这段代码。

@NotThreadSafe
public class ListHelper<E>{
	public List<E> list = 
	     Collections.synchronizedList(new ArrayList<E>());

	public synchronized boolean putIfAbsent(E x){
	    synchronized(list){
               boolean absent = !list.contains(x);
		if(absent)
		     list.add(x);
		  return absent;
	}
     }
}


 
分享到:
评论

相关推荐

    java多线程中的原子操作

    NULL 博文链接:https://peter8015.iteye.com/blog/975250

    Java多线程:AtomicIntegerArray 原子更新数组类.docx

    原子更新数组类顾名思义,通过原子的方式更新数组里的某个元素,Atomic包提供了以下三个类: AtomicIntegerArray:原子更新整型数组里的元素。 AtomicLongArray:原子更新长整型数组里的元素。 ...

    java多线程安全性基础介绍.pptx

    java多线程安全性基础介绍 线程安全 正确性 什么是线程安全性 原子性 竞态条件 i++ 读i ++ 值写回i 可见性 JMM 由于cpu和内存加载速度的差距,在两者之间增加了多级缓存导致,内存并不能直接对cpu可见。 ...

    92道Java多线程与并发面试题含答案(很全)

    Java并发编程的核心概念包括: 线程(Thread):线程是程序执行流的最小单元。...原子操作(Atomic Operations):原子操作是不可中断的操作,即在多线程环境中,这些操作要么完全执行,要么完全不执行。

    Java 多线程与并发(8-26)-JUC原子类- CAS, Unsafe和原子类详解.pdf

    Java 多线程与并发(8_26)-JUC原子类_ CAS, Unsafe和原子类详解

    Java多线程安全问题和锁

    原子操作是不可分割的,体现在两个方面: 一个线程对数据的操作对于其他的线程来说是原子的,要么操作完成,要么什么也没做;当一个线程在操作数据时,不允许其他的线程参与. 可见性是指线程对共享数据的访问是否对其他的...

    详解java多线程的同步控制

    同步控制是并发程序必不可少的...JMM(Java Memory Model)是一种基于计算机内存模型的机制与规范。保证了共享内存的原子性、可见性、有序性 JMM原理图 线程在访问主内存中的变量时并不是直接对主存中的变量进行读写,

    Java多线程Atomic包操作原子变量与原子类详解

    主要介绍了Java多线程Atomic包操作原子变量与原子类详解,简单介绍了Atomic,同时涉及java.util.concurrent中的原子变量,Atomic类的作用等相关内容,具有一定参考价值,需要的朋友可以了解下。

    Java多线程和并发知识整理

    1.1为什么需要多线程 1.2不安全示例 1.3并发问题的根源 1.4JMM 1.5线程安全的分类 1.6线程安全的方法 二、线程基础 2.1状态 2.2使用方式 2.3基础机制 2.4中断 2.5互斥同步 2.6线程合作 三、...

    Sparklingredstar#JavaBooks#Java多线程-Atomic原子类1

    引言JavaGuide :一份涵盖大部分Java程序员所需要掌握的核心知识。star:45159,替他宣传一下子这位大佬,总结的真好!我引用这位大佬的文章,因为

    举例解析Java多线程编程中需要注意的一些关键点

    主要介绍了Java多线程编程中需要注意的一些关键点,包括ThreadLocal变量与原子更新等一些深层次的内容,需要的朋友可以参考下

    concurrent 多线程 教材

    00 IBM developerWorks 中国 : Java 多线程与并发编程专题 02 Java 程序中的多线程 03 编写多线程的 Java 应用程序 04 如果我是国王:关于解决 Java编程语言线程问题的建议 (2) 05 构建Java并发模型框架 (2) 06...

    Java多线程中提到的原子性和可见性、有序性1

    如果应场景需要个更范围的原性保证,Java内存模型还提供了lock和unlock操作来满这种需求,尽管虚拟机未把lock与unlock操作直接开放给户使,但是却

    JUC多线程学习个人笔记

    JUC(Java Util Concurrent)是Java中用于并发编程的工具包,提供了一组接口和类,用于处理多线程和并发操作。JUC提供了一些常用的并发编程模式和工具,如线程池、并发集合、原子操作等。 JUC的主要特点包括: ...

    java并发理论基础、可见性、原子性、有序性详解

    本资源涵盖了Java并发编程的理论基础和实践,主要包括可见性、原子性和有序性的详细介绍,以及多线程的使用原因、好处和坏处等方面...我们还将讲解Java多线程开发的好处和坏处,并探讨如何尽量减少由多线程带来的问题。

    针对于Executor框架,Java API,线程共享数据

    Executor框架是Java并发编程中的一个重要工具,它提供了一种管理...原子操作在并发编程中具有重要的作用,可以保证多个线程对同一个变量的操作是线程安全的。 在两个线程之间共享数据,可以通过以下几种方式实现:

    【2018最新最详细】并发多线程教程

    【2018最新最详细】并发多线程教程,课程结构如下 1.并发编程的优缺点 2.线程的状态转换以及基本操作 3.java内存模型以及happens-before规则 4.彻底理解synchronized 5.彻底理解volatile 6.你以为你真的了解final吗...

    Java并发编程相关源码集 包括多任务线程,线程池等.rar

     volatile关键字的非原子性、volatile关键字的使用、AtomicInteger原子性操作、线程安全小例子:多个线程竞争问题、多个线程多个锁问题、创建一个缓存的线程池、多线程使用Vector或者HashTable的示例(简单线程同步...

    php多进程框架-模拟java多线程接口simple-fork-php.zip

    SimpleFork提供一套类似于JAVA多线程的进程控制接口,提供回收、同步、互斥、通信等方案,开发者可以关注业务问题,不需要过多考虑进程控制。 引入 composer require jenner/simple_fork require path/to/...

    多线程比赛小程序

    比赛可以进行多种参赛...在比赛注册时候使用的都是单线程的报名方式,所以没有考虑安全性,如果需要保证比赛的报名在多线程中进行则只需修改比赛者队列为按线程安全的集合即可。 没有进行严格测试,有兴趣的可以看看。

Global site tag (gtag.js) - Google Analytics