`
longgangbai
  • 浏览: 7370806 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java中原子操作类原则

 
阅读更多

           java.util.concurrent.atomic 包中包括了原子变量( atomic variable )类,这些类用来实现数字和对象引用的原子状态的转换,把long类型的计数器替换成AtomicLong类型的,我们可以确保所有访问计数器状态的操作都是原子的,计数器是线程安全的了,而计数器的状态就是servlet的状态,所以我们的servlet再次车归纳为线程安全的了。

 

 

使用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中提供的原子操作类

          AtomicIntegerAtomicBooleanAtomicLongAtomicReference等。这是由硬件提供原子操作指令实现的。在非激烈竞争的情况下,开销更小,速度更快。

 

        为了确保线程的全权,“检查再运行”操作(如惰性初始化)和读改写操作(如自增)必须是原子操作。
我们将“检查再运行” 和读改写操作的全部执行过程看作是符合操作。为了保证线程安全,操作必须原子
地执行。

分享到:
评论

相关推荐

    Java文件操作封装类

    Java文件操作封装类

    java日期操作类

    java日期操作类 操作java日期 替换simplatedateformate

    java数据库操作类

    java数据库操作类

    Java并发编程_设计原则和模式(CHM)

    Java的Atomic类(如AtomicInteger、AtomicReference)提供了基于硬件级别的原子操作,能够在不使用锁的情况下保证并发安全性。 七、并发容器 Java并发库提供了线程安全的容器,如ConcurrentHashMap、...

    java 文件操作工具类

    java 文件操作工具类

    Java注册表操作类 jared.7z

    "Java注册表操作类 jared.7z"很可能包含了一个Java类库,这个库提供了对Windows注册表进行读写操作的功能。在Windows操作系统中,注册表是一个重要的数据库,存储了系统和应用程序的各种配置信息。下面我们将详细...

    java随机数操作类

    一个产生随机数的操作类,可自由定制随机数的类型个数等 用于产生校验码等

    Java并发编程设计原则和模式

    5. 原子操作模式:使用java.util.concurrent.atomic包中的原子类,如AtomicInteger,提供无锁的并发操作。 四、同步机制 1. synchronized关键字:用于实现线程互斥,保证同一时刻只有一个线程访问共享资源。 2. ...

    java对properties的操作工具类

    java对properties的操作工具类 属性文件

    java 文件操作

    首先,我们了解Java中进行文件操作的基础类:`java.io.File`。这个类是文件和目录路径名的抽象表示,它提供了许多与文件和目录相关的操作方法。 1. **文件对象的创建**: - 使用`new File(String path)`构造函数...

    欧柏泰克:Java常用类库--日期操作类

    在 Java 语言中,日期操作类是非常重要的一部分,常用的日期操作类有 Date 类、Calendar 类和 DateFormat 类。下面是对这三个类的详细介绍: Date 类 Date 类是 Java 语言中最基本的日期操作类,位于 java.util ...

    java操作日期时间工具类

    Java提供了多种工具类来帮助开发者进行日期时间的操作,其中最常用的是`java.util.Date`、`java.util.Calendar`以及`java.time`包中的类。本篇将重点介绍Java操作日期时间的工具类,特别是通过`DateUtil.java`这个...

    Java常用工具类大全,工作5年精心整理(最新版)

    提供了很丰富的java工具类,包括字符串、数字、日期、文件、图像、编码解码、校验工具、文档操作等。 主要分为以下几种: - 1.通用操作类,例如String、数字、日期、各种校验等 - 2.文档操作,excel、pdf等 - 3.加密...

    Java各种工具类

    3. **java.io**: 提供了输入输出流相关的类和接口,用于进行数据的读写操作。例如,FileInputStream和FileOutputStream用于文件的读写,BufferedReader和PrintWriter用于字符流的处理,而ObjectInputStream和...

    java操作sqlite数据库工具代码及jar包

    总结一下,本资源提供了使用Java操作SQLite数据库所需的基本元素:`sqlite-jdbc.jar`作为JDBC驱动,以及一个工具类来简化数据库操作。通过导入jar包和使用工具类,开发者可以快速地在Java项目中实现对SQLite数据库的...

    Java实现获取窗口句柄并操作窗口jna-4.4.0

    为了弥补这个不足,开发人员可以使用Java Native Access (JNA),这是一个Java平台上的库,允许Java代码调用本机库函数,与操作系统进行更直接的交互。 JNA是Java与本机代码之间的一个桥梁,它消除了编写C/C++头文件...

    java utils 工具类

    例如,`java.util.Arrays`就是Java内置的一个工具类,提供了对数组的各种操作。 ### 2. `ProcessUtil` 类概述 `ProcessUtil.java`文件中的`ProcessUtil`类很可能是用来处理系统进程的工具类。在Java中,我们可以...

    C# ACCESS 数据库操作类

    "C# ACCESS 数据库操作类"是一个自定义的C#类,设计用来简化对Access数据库的增、删、改、查等操作。这个类通常封装了ADO.NET的核心组件,如Connection、Command、DataAdapter和DataSet,使得代码更加模块化和易于...

    把wsdl文件转换成java类 使用wsdl2Java工具

    为了在Java环境中与这些Web服务交互,我们需要将WSDL文件转换为Java类,这就是`wsdl2java`工具的作用。 `wsdl2java`是Apache Axis项目的一部分,它是一个强大的工具,可以自动生成Java客户端和服务端代码,这些代码...

    java图片处理工具类JAR包 java-image-scalingjar

    java图片处理工具类JAR包 java-image-scalingjar

Global site tag (gtag.js) - Google Analytics