`
longgangbai
  • 浏览: 7357254 次
  • 性别: 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操作文件工具类

    文件工具类java操作文件工具类java操作文件工具类java操作文件工具类java操作文件工具类

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

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

    Java四子棋

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

    java 文件操作工具类

    java 文件操作工具类

    Java中File类对文件的几个常见操作实例总结

    Java 中 File 类对文件的几个常见操作实例总结 File 类是 Java 语言中对文件操作的核心类之一,提供了许多实用的方法来操作文件和文件夹。在实际开发中,我们经常需要对文件进行创建、移动、拷贝、删除等操作,因此...

    java pdf 实现电子签章下载

    Java PDF实现电子签章是PDF文档处理中的一个重要技术,它涉及到PDF库的使用以及数字证书的应用。在这个场景中,我们关注的是使用iTextPDF和PDFBox两个流行的Java库来完成电子签章的功能。这两个库提供了丰富的API,...

    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多线程操作数据库:深入解析与应用 在当今高度并发的应用环境中,Java多线程技术被广泛应用于处理数据库操作,以提升系统的响应速度和处理能力。本文将基于一个具体的Java多线程操作数据库的应用程序,深入...

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

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

    java操作日期时间工具类

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

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

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

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

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

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

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

    JAVA识别OFD电子发票文件

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

Global site tag (gtag.js) - Google Analytics