`
longgangbai
  • 浏览: 7315732 次
  • 性别: 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 mysql 操作类

    java mysql 操作类 用面向对象的思路封装大部分mysql的操作

    java操作ldap类

    java操作ldap类java操作ldap类java操作ldap类

    java操作文件工具类

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

    java操作es工具类整理.rar

    Java操作Elasticsearch(ES)工具类的整理主要聚焦于如何使用Java API与Elasticsearch进行交互,包括索引管理、文档操作、查询与聚合等核心功能。在给定的"java操作es工具类整理.rar"压缩包中,EsClientTest.java是...

    基于Java的数据库操作类设计源码

    该项目为基于Java的数据库操作类设计源码,总计包含74个文件,主要涵盖69个Java源文件、2个Gradle配置文件、1个Git忽略文件以及1个LICENSE文件。该类库实现了SQL的动态拼装功能,并支持在JPA环境下处理复杂原生SQL...

    java常用的工具类整理28个

    在Java编程语言中,工具类(Utility Class)是包含各种静态方法的类,这些方法用于执行特定任务,如数据操作、文件处理、数学计算等。它们通常不包含实例变量,只提供静态方法服务,帮助开发者提高代码的复用性和...

    java pdf 实现电子签章下载

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

    【强2】30个java工具类

    [工具类] 文件操作工具类 .java.txt [工具类] 序列化保存为XML文件的工具类 .java.txt [工具类] 一个压缩工具类.java.txt [工具类] 用java编写简单UDP网络通信程序 .java.txt [工具类] 中文验证.jsp.txt [工具类] ...

    java 三子棋 源代码

    在这个游戏中,Player类可能继承自一个抽象的PlayerBase类,Game类可能会有抽象方法如makeMove(),让玩家进行操作。 5. **游戏逻辑**:实现游戏逻辑包括判断胜负条件、检查是否有空位可下、切换玩家等。这通常在...

    Java CTool.java一个好用的字符串操作类.rar

    分享一个Java字符串操作类CTool.java源代码下载,包括了字符串转换功能,此类中收集Java编程中WEB开发常用到的一些工具。为避免生成此类的实例,构造方法被申明为private类型的。这个类的功能可实现将数据从数据库中...

    java视频教程—Java文件操作

    java视频教程 Java文件操作 JavaFile

    基于Java的实例源码-注册表操作类 jared.zip

    "基于Java的实例源码-注册表操作类 jared.zip" 提供了一个用Java实现的注册表操作类,这对于理解如何在Java应用程序中与Windows注册表交互非常有帮助。下面将详细介绍这个知识点。 首先,Windows注册表是一个存储...

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

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

    整理的若干java常用工具类

    Java Util是Java标准库中的一个核心包,包含了大量用于处理各种通用任务的类,如集合操作、日期时间处理、字符串操作等。这些工具类通常具有高度的可重用性,遵循单一职责原则,使得开发者能够快速地解决特定问题。 ...

    java模拟实现PV操作

    在Java中,我们可以使用内置的`java.util.concurrent`包中的`Semaphore`类来实现PV操作,但这里我们将探讨如何利用`wait()`和`notify()`方法进行模拟。 首先,理解生产者-消费者问题是关键。生产者负责生产数据,而...

    java 随机读写Java类文件

    在Java编程中,随机读写Java类文件是一个高级主题,涉及到对字节码级别的操作,通常用于类的动态加载、代码注入或者逆向工程等场景。以下是对这一主题的详细阐述: 1. **Java类文件结构**:首先,了解Java类文件的...

    java操作mongodb的工具类

    java操作mongodb的工具类,增删查改方法

    有效处理JAVA异常三原则

    为了深入理解和正确实施这一机制,本文将阐述有效处理Java异常的三个重要原则,并结合JCheckbook类的示例进行讨论。 首先,Java中的异常是由Throwable类的层次结构所定义的,其中包含了Error、Exception以及...

    JAVA鼠标操作类---用JAVA编写的QQ农场偷菜类

    呵呵,无聊玩QQ农场偷菜,用JAVA写的一个对鼠标操作的类。主要用鼠标定位屏幕的X坐标和Y坐标进行操作。需要传入几个参数,主要如下: * @param startX 好友栏第一个好友起始X坐标 * @param startY 好友栏第一个好友...

Global site tag (gtag.js) - Google Analytics