JAVA乐观的并发策略基于CAS的自旋



JAVA乐观的并发策略基于CAS的自旋.

悲观者与乐观者的做事方式完全不一样,悲观者的人生观是一件事情我必须要百分之百完全控制才会去做,否则就认为这件事情一定会出问题;而乐观者的人生观则相反,凡事不管最终结果如何,他都会先尝试去做,大不了最后不成功。这就是悲观锁与乐观锁的区别,悲观锁会把整个对象加锁占为自有后才去做操作,乐观锁不获取锁直接做操作,然后通过一定检测手段决定是否更新数据。这一节将对乐观锁进行深入探讨。

上节讨论的Synchronized互斥锁属于悲观锁,它有一个明显的缺点,它不管数据存不存在竞争都加锁,随着并发量增加,且如果锁的时间比较长,其性能开销将会变得很大。有没有[......]

Read more

Java并发框架 AQS之原子性如何保证?



Java并发框架 AQS之原子性如何保证?

在研究AQS框架时,会发现这个类很多地方都使用了CAS操作,在并发实现中CAS操作必须具备原子性,而且是硬件级别的原子性,java被隔离在硬件之上,明显力不从心,这时为了能直接操作操作系统层面,肯定要通过用C++编写的native本地方法来扩展实现。JDK提供了一个类来满足CAS的要求,sun.misc.Unsafe,从名字上可以大概知道它用于执行低级别、不安全的操作,AQS就是使用此类完成硬件级别的原子操作。

Unsafe是一个很强大的类,它可以分配内存、释放内存、可以定位对象某字段的位置、可以修改对象的字段值、可以使线程挂起、使线程恢[......]

Read more

Java并发框架AQS如何使用AQS构建同步器介绍

Java并发框架AQS如何使用AQS构建同步器介绍。AQS的设计思想是通过继承的方式提供一个模板让大家可以很容易根据不同场景实现一个富有个性化的同步器。同步器的核心是要管理一个共享状态,通过对状态的控制即可以实现不同的锁机制。AQS的设计必须考虑把复杂重复且容易出错的队列管理工作统一抽象出来管理,并且要统一控制好流程,而暴露给子类调用的方法主要就是操作共享状态的方法,以此提供对状态的原子性操作。一般子类的同步器中使用AQS提供的getState、setState、compareAndSetState三个方法,前两个为普通的get和set方法,要使用这两个方法必须要保证不存在数据竞争,compa[......]

Read more

tomcat如何避免遭遇ClassNotFoundException错误

tomcat如何避免遭遇ClassNotFoundException错误。在Tomcat中为什么创建类加载器后马上就Thread.currentThread().setContextClassLoader(catalinaLoader)?这里主要是为了避免后面加载类时加载失败。下面将举一个典型的例子说明如何利用URLClassLoader加载指定的jar包,并且解析由此引出的加载失败问题。
首先,定义一个提供服务的接口,并且打包成TestInterface.jar。
public interface TestInterface{
public String display();
}[......]

Read more

Tomcat的系统安全管理

Tomcat的系统安全管理.Tomcat是一个Web容器,我们开发的Web项目运行在Tomcat平台,这就好比将一个应用嵌入到一个平台上面运行,要使嵌入的程序能正常运行,首先平台要能安全正常运行。并且要最大程度做到平台不受嵌入的应用程序影响,两者在一定程度上达到隔离的效果。Tomcat与Web项目也是要最大程度隔离,使Tomcat平台足够安全。
我们先看看Tomcat可能存在哪些安全威胁。
(1) 在web应用的jsp页面或Servlet中使用System.exit(1);
假如你是一个老板,但是平时对待员工苛刻,工资又老是不准时发,承诺给员工的福利又做不到,所有员工敢怒不敢言,在背后严[......]

Read more

Tomcat中的ssl安全信道的实现

Tomcat中的ssl安全信道的实现.为了实现https协议通信,tomcat需要利用JSSE把SSL/TLS协议集成到自身系统上,通过上一节我们知道不同的厂商可以实现自己的JSSE,而tomcat默认使用的是以前sun公司开发实现的包而且由JDK自带。
Tomcat实现http及https通信的基础是什么?其实http与https的不同就是在创建通信套接字服务器时的不同,http是没有任何加密措施的套接字服务器,而https是靠嵌套了一层密码机制的套接字服务器。在实现时只需根据实际通信情况创建对应的套接字服务器,这时你应该果断想起工厂类,由各自工厂负责创建及初始化套接字服务器。看图3-1-[......]

Read more

Java多线程模型

Java多线程模型.

谈到Java多线程就涉及到多线程的模型及Java线程与底层操作系统之间的关系。正如我们熟知,现代机器可以分为硬件和软件两大块,如图2-5-1-1,硬件是基础,软件提供实现不同功能的手段。而且软件可以分为操作系统和应用程序,操作系统专注于对硬件的交互管理并提供一个运行环境给应用程序使用,应用程序则是能实现若干功能的并且运行在操作系统环境中的软件。同样,线程按照操作系统和应用程序两层次可以分为内核线程(Kernel Thread)和用户线程(User Thread)。

图2-5-1-1
所谓内核线程就是直接由操作系统内核支持和管理的线程,线程的建立、启动、同步、[......]

Read more

Java并发框架——什么是AQS框架

Java并发框架——什么是AQS框架?

什么是AQS框架

1995年sun公司发布了第一个java语言版本,可以说从jdk1.1到jdk1.4期间java的使用主要是在移动应用和中小型企业应用中,在此类领域中基本不用设计大型并发场景,当然也没有大型互联网公司使用java,因为担心它本身的性能。在互联网及服务器硬件迅猛的发展下,sun公司更加注重企业级应用方面,毫无疑问高并发是一个重要的主题,于是在J2SE5.0(jdk1.5)代号为老虎的版本中增加了更加强大的并发相关的操作包——java.util.concurrent。此后java在高并发中表现优异,很多大型互联网公司都使用java作为主[......]

Read more

socket系列之什么是socket

socket系列之什么是socket?

1、什么是socket

Socket是应用层与TCP/IP协议族通信的中间抽象层,它是一组接口,应用层通过调用这些接口实现发送和接收数据。一般这种抽象层由操作系统提供或者由JVM自己实现。使用socket可以简单地实现应用程序在网络上得通信,一台机器上的应用想socket写入信息,另外一台相连的机器能读取到。TCP/IP协议族中分两种socket类型,分别是流套接字和数据报套接字,分别对应TCP协议和UDP协议。一个TCP/IP套接字由一个互联网地址,一个协议及一个端口号唯一确定。
如图2-3-1,socket抽象层在传输层与应用层之间,增加这[......]

Read more

Java多线程的调度策略

Java多线程的调度策略。

在Java多线程环境中,为保证所有线程的执行能按照一定的规则执行,JVM实现了一个线程调度器,它定义了线程调度的策略,对于CPU运算的分配都进行了规定,按照这些特定的机制为多个线程分配CPU的使用权。这小节关注线程如何进行调度,了解了java线程调度模式有助于后面并发框架的深入探讨。

一般线程调度模式分为两种——抢占式调度和协同式调度。抢占式调度指的是每条线程执行的时间、线程的切换都由系统控制,系统控制指的是在系统某种运行机制下,可能每条线程都分同样的执行时间片,也可能是某些线程执行的时间片较长,甚至某些线程得不到执行的时间片。在这种机制下,一个线程的堵[......]

Read more