`
lzg406
  • 浏览: 60978 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

分析现在公司AtomicLong应用代码

    博客分类:
  • java
阅读更多
最近刚换工作,项目组人员很忙,没人理我,无事闲看代码,看的第一段代码,发现很有意思,特记录下来;

/**
	 * 获取流水号
	 * 
	 * @return
	 * @throws SerialGenneratorException 
	 */
	protected String getSerial() throws SerialGenneratorException {

		synchronized (serial) {//serial是AtomicLong类型
			long sn = serial.getAndIncrement();
			if (sn + 1 > this.getLimit()) {//如果达到上限,则更新上限
				serial.set(this.allocate());//更新上限
				sn = serial.getAndIncrement();
			}
			// System.out.println(Thread.currentThread().getId()+"------"+sn);
			return seiralFormat(sn, length);
		}
	}





自我分析后,很明显,改成以下代码,效率会成倍提高



	protected String getSerial() throws SerialGenneratorException {
		long sn = serial.getAndIncrement();
		if (sn + 1 > this.getLimit()) {// 如果达到上限,则更新上限
			synchronized (serial) {// serial是AtomicLong类型
				if (sn + 1 > this.getLimit()) {// 如果仍然达到上限,则更新上限
					serial.set(this.allocate());// 更新上限
					sn = serial.getAndIncrement();
				}
			}
		}
		return seiralFormat(sn, length);
	}



分享到:
评论
11 楼 hnist0603 2018-05-10  
锋之弥漫 写道
itao 写道
AtomicLong等类在实现同步时,没有用synchronized关键字,而是直接使用了最低层(本地c语言实现代码)来完成的。所以他本身是同步的,个人认为,不需要使用synchronized关键字就可以。


赞同2楼的说法,因为既然AtomicLong已经是线程安全类,那么对于serial来说就是线程安全的,这是一个复合操作,其他对象在访问serial时是线程安全的,原子性能保证getSerial方法的返回值也是线程安全的,因为该方法内的操作都是对serial对象的操作,既然它是线程安全的因此这个方法内的操作要么都做,要么都不做,原子性能保证它的线程安全,所以没有必要使用synchronized。假设需要的话,那就没有必要使用AtomicLong了,用Long就可以了啊,因为可以用synchronized包起来保证线程安全

光保证AtomicLong的状态正确还不行,这里还用了this.allocate(), 如果两个线程同时去allocate()的话会造成浪费和不必要,甚至发生业务上的错误,所以这里还是需要synchronized来同步检查的,博主这样改是正确的
10 楼 angole 2015-01-02  
代码2之所以性能比代码1高,是因为避免了很多不必要的同步等待。
代码2不满足if条件的可以直接跳转了,而代码1实现等待,再判断。
另外虽然AtomicLong类是线程安全的,但多个原子操作的复合操作就未必是线程安全的。
所以代码中的synchronized还是必要的。
9 楼 MrLee23 2014-07-18  
建议直接在方法名上直接使用synchronized,这样保证方法内所有的操作都是安全的,还能给调用者一个提示,为此方法是安全的。
8 楼 wzx8118 2014-01-22  
我看到原子量要和lock一块用,更安全,不知道对不对
7 楼 锋之弥漫 2013-05-02  
itao 写道
AtomicLong等类在实现同步时,没有用synchronized关键字,而是直接使用了最低层(本地c语言实现代码)来完成的。所以他本身是同步的,个人认为,不需要使用synchronized关键字就可以。


赞同2楼的说法,因为既然AtomicLong已经是线程安全类,那么对于serial来说就是线程安全的,这是一个复合操作,其他对象在访问serial时是线程安全的,原子性能保证getSerial方法的返回值也是线程安全的,因为该方法内的操作都是对serial对象的操作,既然它是线程安全的因此这个方法内的操作要么都做,要么都不做,原子性能保证它的线程安全,所以没有必要使用synchronized。假设需要的话,那就没有必要使用AtomicLong了,用Long就可以了啊,因为可以用synchronized包起来保证线程安全
6 楼 wml199039 2012-06-15  
itao 写道
AtomicLong等类在实现同步时,没有用synchronized关键字,而是直接使用了最低层(本地c语言实现代码)来完成的。所以他本身是同步的,个人认为,不需要使用synchronized关键字就可以。



原子方法正是从指令层(并不是二楼所说的C语言)来解决同步问题的,
if (sn + 1 > this.getLimit()) 这句必须放在synchronized块中
因为可能会有两个线程“同时”执行该语句,这样就会导致业务错误
5 楼 wml199039 2012-06-15  
原子方法正是从指令层(并不是二楼所说的C语言)来解决同步问题的,
if (sn + 1 > this.getLimit()) 这句必须放在synchronized块中
因为可能会有两个线程“同时”执行该语句,这样就会导致业务错误
4 楼 XINRUIBAOBAO 2012-06-08  
不赞同,2楼的意见,这种先检查再运行的代码最好还是要synchronized一下
3 楼 jack547155187 2012-03-29  
赞成2楼的意见
2 楼 itao 2012-03-14  
AtomicLong等类在实现同步时,没有用synchronized关键字,而是直接使用了最低层(本地c语言实现代码)来完成的。所以他本身是同步的,个人认为,不需要使用synchronized关键字就可以。
1 楼 zhou2008gang 2012-01-11  
如果是多线程来访问你的程序,会不会有问题?long sn = serial.getAndIncrement();  
这个有没有同步?

相关推荐

    Java多线程设计模式源代码

    本资料包含的源代码将深入探讨各种多线程设计模式,帮助开发者理解和应用这些模式。 一、线程基础 在Java中,可以通过实现`Runnable`接口或继承`Thread`类来创建线程。`Runnable`接口允许你将任务逻辑封装在一个类...

    基于java的锁具装箱的源程序代码

    Java中的锁装箱是并发编程中的一个重要概念,它涉及到Java的并发工具类,特别是`java.util.concurrent.atomic`包中的...通过学习和分析这个源代码,开发者可以深入理解Java并发机制,提高在多线程环境下的编程技能。

    Java 7 Concurrency Cookbook EN pdf及代码

    《Java 7 Concurrency Cookbook》是...书中的每个章节都包含了实际的代码实现,可以帮助读者更好地理解和应用这些并发编程技术。无论你是初学者还是经验丰富的开发者,都可以从中受益,提升自己在并发编程领域的技能。

    实战Java高并发程序设计-随书代码

    《实战Java高并发程序设计》是一本专注于Java并发编程实践的书籍,随书代码提供了大量示例,帮助读者深入理解并掌握在实际开发中如何处理高并发场景下的问题。本书的核心知识点涵盖了Java并发编程的基础理论、核心...

    实战Java高并发程序设计(电子书加书中的代码)

    《实战Java高并发程序设计...通过学习《实战Java高并发程序设计》并结合书中提供的代码示例,开发者可以掌握Java并发编程的核心技能,提升在多线程环境下的程序设计和调试能力,从而编写出更加高效、稳定的企业级应用。

    JUC并发编程与源码分析视频课.zip

    在本课程中,你将学习到如何利用这些工具来提升应用程序的并发性能,同时理解其底层实现原理。 课程内容可能涵盖以下几个核心知识点: 1. **线程与并发基础**:首先,会介绍Java中的线程概念,包括线程的创建、...

    实战Java高并发程序设计第二版随书代码

    随书附带的`concurrentbook`和`concurrentbook-jdk7`文件夹可能包含了与上述知识点对应的示例代码,通过阅读和运行这些代码,读者可以更好地理解和掌握Java并发编程的实际应用。在实践中不断探索和调试,将有助于...

    狂神说Java-多线程课程全部代码.rar

    通过分析和运行压缩包中的demo01等代码示例,开发者可以更直观地了解和学习这些概念和技术,并将其应用到自己的项目中。 在学习多线程时,理解线程的状态转换(新建、就绪、运行、阻塞、死亡)以及Java内存模型...

    sonar-JAVA检查规则指南.docx

    SonarQube 是一个广泛使用的静态代码分析工具,用于检查 Java 项目中的 bug、漏洞和坏味道。 SonarQube 提供了许多内置规则,用于检查 Java 代码的质量和安全性。下面是 SonarQube 中的一些基本内置规则: 1. 不要...

    Java 并发编程实战 中英文+代码示例

    书中结合了理论与实际示例,提供了丰富的代码示例,使得读者能够通过实际操作来加深对并发编程的理解。 在Java并发编程领域,以下几个核心知识点是本书的重点: 1. **线程基础**:介绍Java中的Thread类,如何创建...

    Java多线程与并发库高级应用

    - **synchronized关键字**:可以作用于实例方法、静态方法以及代码块,保证同一时刻只有一个线程可以访问被同步的代码段。 - **ReentrantLock**:显式锁,提供比`synchronized`更强大的锁定机制,可以实现公平锁和非...

    java api2.rar

    注解可以用于类型、方法、变量等,帮助进行代码的静态分析、编译时检查和运行时处理。例如,`@Override` 注解用来标记覆盖父类方法的方法,确保方法签名的正确性。 此外,Java 5还改进了类型推断(Type Inference)...

    Java并发编程从入门到精通源码.rar

    总的来说,这个资源包涵盖了Java并发编程的核心概念和技术,结合源码分析,学习者可以深入理解并发编程的原理,提升在实际项目中的应用能力。通过实践和调试源码,可以更好地掌握这些知识点,提高解决问题的能力。

    concurrent:java并发编程的示例和原始代码分析

    本资源“concurrent:java并发编程的示例和原始代码分析”提供了深入理解和实践Java并发特性的宝贵材料。以下是对该资源中可能包含的知识点的详细说明: 1. **Java并发API**: 这个资源可能涵盖了Java的并发库,包括`...

    7.深圳各公司JAVA面试题综合

    - 模板方法模式:在代码复用和扩展中应用模板方法设计模式。 7. **框架应用** - Spring框架:了解依赖注入(DI)和控制反转(IoC)的概念,Spring Bean的生命周期管理。 - Spring MVC:掌握请求处理、视图解析、...

    如何通过C#实现单据号码的自动增加

    #### 应用场景 这种单据编号的自动生成机制适用于各种需要按顺序生成唯一编号的场景,如订单编号、发票编号等。通过这种方式可以确保编号的唯一性和连续性,同时减少手动输入的错误。 #### 总结 通过上述分析,...

    Java并发编程实践

    6. **原子变量**:分析AtomicInteger、AtomicLong和AtomicReference等原子变量类,以及它们如何实现无锁编程和高效并发操作。 7. **线程局部变量**:解释ThreadLocal类的工作原理,如何为每个线程提供独立的变量...

    同步处理

    一种是使用`synchronized`关键字,它可以修饰方法或代码块,确保同一时间只有一个线程可以执行这部分代码。另一种方式是使用`Lock`接口及其实现,如`ReentrantLock`,提供了更细粒度的控制,允许更复杂的同步策略。 ...

    JAVA并发编程实践JavaConcurrencyinPractice-中文-高清-带书签-完整版(Doug Lea)

    《JAVA并发编程实践》是...通过阅读《JAVA并发编程实践》,开发者能够理解并发编程的复杂性,学习到如何编写高效、健壮的并发代码,从而提升Java应用程序的性能和可靠性。这本书是Java并发编程领域不可或缺的参考书目。

Global site tag (gtag.js) - Google Analytics