`
longgangbai
  • 浏览: 7340555 次
  • 性别: 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 properties文件操作工具类,可追加修改

    此工具类只用于Java后端在操作Properties文件的时候写的工具类,方便properties文件的存取操作

    Java四子棋

    在Java四子棋项目中,面向对象编程(OOP)概念是核心,如类(Class)、对象(Object)、继承(Inheritance)和多态(Polymorphism)等。游戏的核心类可能包括棋盘(Board)、棋子(Coin)、玩家(Player)和游戏逻辑...

    java 文件操作工具类

    java 文件操作工具类

    java并发编程:设计原则与模式.rar

    Java并发工具类库(java.util.concurrent)是并发编程中的另一个重要主题,包括Atomic类(提供原子操作)、Semaphore(信号量)、CountDownLatch(计数器门锁)、CyclicBarrier(循环栅栏)和Exchanger(交换器)等...

    java随机数操作类

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

    java 文件操作

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

    完整的java文件读写工具类

    在`java.io`包中,包括了File、InputStream、OutputStream、Reader、Writer等类,用于进行文件和流的操作。 2. **File类**: - **创建文件**:`File file = new File("path"); file.createNewFile();` - **删除...

    Java时间类的操作

    我自己写的一个时间组建,主要是计算两个时间段之间的相隔时间 和一个时间与现在时间之间的时间差....

    java 通过反射获取枚举类,及枚举类的值,枚举类枚举实例名

    在Java编程语言中,反射(Reflection)是一种强大的工具,它允许程序在运行时检查和操作类、接口、字段和方法等对象。枚举(Enumeration)是Java中的一个特殊类类型,用于定义一组常量。本项目"test-enum-demo-...

    Java类思维导图

    总而言之,"Java思维导图"可能涵盖了这些核心概念,包括但不限于类的定义、继承、接口、访问修饰符、关联关系、聚合与组合、方法以及面向对象的三大原则。通过深入学习这张图,开发者可以更好地理解和应用Java的类...

    Java各种工具类

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

    JAVA识别OFD电子发票文件

    根据OFD文件打包规范编写的OFD电子发票关键信息识别...整个类无第三方引用包,使用纯dom编写,使用方便稳定。程序可识别出电子发票上的发票代码、发票号码、合计税额、合计金额、开票日期等信息,且读取后不创建文件。

    java utils 工具类

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

    C# ACCESS 数据库操作类

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

    JAVA28个常用工具类

    4. **ClassUtils.java**: 类操作工具类,提供了一些辅助方法,比如加载类、检查类是否实例化、获取类的属性和方法等。在Spring框架中,有类似的名字为`org.springframework.util.ClassUtils`,它提供了很多实用的类...

    java开发常用工具类大全,程序员必备工具

    本文将详细解析“java开发常用工具类大全”中涉及的关键知识点,包括但不限于输入字符校验、数据转换、网络操作、加密解密、JSON处理、图像操作以及数据库操作。 1. **输入字符校验类**: 这类工具通常包含对字符...

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

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

Global site tag (gtag.js) - Google Analytics