Java中原子操作类原则
来源:互联网 发布:网络言情小说典藏版 编辑:程序博客网 时间:2024/04/28 17:33
使用java.util.concurrent包中支持多线程的数据结构类(如:ConcurrentHashMap等),对写多线程JAVA程序带来很多方便.其中:java.util.concurrent.atomic包是提供原子操作的基本类.如:AtomicLong类.为了提高性能,AtomicLong等类在实现同步时,没有用synchronized关键字,而是直接使用了最低层(本地c语言实现代码)来完成的,因而你是看不到用synchronized关键字的.
比如:AtomicLong类中原子操作方法:
public final boolean compareAndSet(long expect, long update) ;
就是直接使用SUN公司低层本地代码的原子方法(native方法):
public final native boolean compareAndSwapLong(...)
来实现的.
如下面的Servlet的非安全线程的:
- package com.etrip.web;
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- /**
- * Servlet implementation class CountServlets
- */
- public class CountServlets extends HttpServlet {
- private static final long serialVersionUID = 1L;
- //记录访问此Servlet的数量
- private static long count=0;
- /**
- * @see HttpServlet#HttpServlet()
- */
- public CountServlets() {
- super();
- // TODO Auto-generated constructor stub
- }
- /**
- * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
- */
- @Override
- protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- PrintWriter pw=response.getWriter();
- count++;
- pw.print("当前的请求次数为为:"+count);
- pw.flush();
- pw.close();
- }
- }
利用像AtomicLong这样已有的线程安全对象管理类的状态是非常实用的,相对于非线程安全对象,判断一个线程安全对象的可能状态和状态的转换要容易的多了,这简化了维护和验证 线程安全性的工作。
- package com.etrip.web;
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.concurrent.atomic.AtomicLong;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.util.concurrent.atomic.*;
- /**
- *
- *
- *
- */
- public class CountExtServlet extends HttpServlet {
- private static final long serialVersionUID = 1L;
- //记录访问此Servlet的数量
- private final AtomicLong count=new AtomicLong(0);
- /**
- * @see HttpServlet#HttpServlet()
- */
- public CountExtServlet() {
- super();
- // TODO Auto-generated constructor stub
- }
- /**
- * @see HttpServlet#service(HttpServletRequest request, HttpServletResponse response)
- */
- @Override
- protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- PrintWriter pw=response.getWriter();
- count.incrementAndGet();
- pw.print("当前的请求次数为为:"+count.get());
- pw.flush();
- pw.close();
- }
- }
Java中提供的原子操作类
AtomicInteger,AtomicBoolean,AtomicLong,AtomicReference等。这是由硬件提供原子操作指令实现的。在非激烈竞争的情况下,开销更小,速度更快。
为了确保线程的全权,“检查再运行”操作(如惰性初始化)和读改写操作(如自增)必须是原子操作。
我们将“检查再运行” 和读改写操作的全部执行过程看作是符合操作。为了保证线程安全,操作必须原子
地执行。
来自:http://topmanopensource.iteye.com/blog/1735978
- Java中原子操作类原则
- Java并发中原子操作的实现
- java中原子变量AtomicInteger等用法
- java中原子变量AtomicInteger等用法
- ARM体系结构中原子操作 ATOMIC 的实现
- 嵌入式 linux下kernel代码中原子性操作atomic_t
- linux中原子操作atomic_read、atomic_set、atomic_add、atomic_sub
- 关于C11标准中原子操作,看这篇就够了!
- gcc中原子加减交换
- 说说Java中原子性,可见性与指令重排序的理解
- SQLITE中原子提交的实现
- Java中原子类的实现
- java中原来可以判断对象是否是属于一个类
- 数据库中原子性,隔离性,一致性如何实现?
- 计算机中原码,反码和补码和移位操作
- java中原码、反码和补码--时钟理解法
- Linux内核ARM构架中原子变量的底层实现研究
- Linux内核ARM构架中原子变量的底层实现研究
- SDB-Schedule 简洁计划任务框架
- hdu 4740 The Donkey of Gui Zhou dfs 搜索 解题报告
- java 多线程:原子性
- HDU-1022Train Problem I,简单栈模拟;
- TextView 加下划线的2种方式
- Java中原子操作类原则
- ggplot_坐标轴
- scala学习笔记--高阶函数
- SpringMVC 注解
- 【BZOJ1867】[Noi1999]钉子和小球【DP】
- 扩展 easyui 控件系列:为datagrid 增加过滤行
- 1. Two Sum
- KnockoutJs简单入门知识讲解
- Java基础知识二