`

java 并发

阅读更多

能够写出高伸缩性的并发是一门艺术

 

在JAVA SE5中新增了3个包

  • java.util.concurrent
  • java.util.concurrent.atomic
  • java.util.concurrent.locks

在java的内存模型中,类的实例字段、静态字段和构成数组的对象元素都会被多个线程所共享,局部变量与方法参数都是线程私有的,不会被共享。

 

每个线程都有自己的工作内存(高速缓冲区),共享主内存的数据。线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,不能直接读写主内存的变量。不同的线程也无法访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。

 

volatile保证新值能能立即同步到主内存,以及每次使用前即从住内存刷新

禁止指令重排(机器及的优化操作)

 

线程是cpu调度的基本单位,java语言提供了在不同硬件和操作系统平台下对线程操作的统一处理。

实现线程主要有3中方式:使用内核线程实现、使用用户线程实现和使用用户线程加轻量级进程混合实现。

不同虚拟机不同实现

java使用线程调度方式是抢占式的

线程状态:

  • 新建:创建后尚未启动的线程处于这种状态
  • 运行:Runable包含了操作系统线程状态中的Running和Ready,也就是处于此状态的线程有可能正在执行,也有可能正在等待cpu为它分配执行时间
  • 无限期等待:不会分配cpu执行时间,他们等待被其他线程显示的唤醒,没有设置Timeout的Object.wait()和Thread.join()、LockSupport.park()
  • 限期等待:也不会分配cpu执行事件,不过无需等待被其他线程显示的唤醒,一定时间后自动唤醒,Thread.sleep()、设置了参数的Object.wait()和Thread.join()、LockSupport.parkNanos()、LockSupport.parkUntil()。
  • 阻塞:阻塞在等待获得一个排他锁
  • 结束:以终止的线程状态,线程已经结束执行。

要保证线程安全,并不一定要进行同步,两者没有因果关系,同步知识保证共享数据争用时的正确手段,

 

synchronized修饰方法,锁是当前对象。静态的方法锁的是Class对象 。获取锁操作的粒度是线程。

		// 恢复被中断的状态
		Thread.currentThread().interrupt();

 

java.util.concurrent

这个包下有并发容器、和线程池

减少锁竞争:

  •   缩小锁的范围(快进快出)
  •   减小锁的粒度(通过所分解技术:将一个锁分解为两个锁)
  •   锁分段
  •   避免热点域

并发容器:http://flyouwith.iteye.com/blog/2206550

同步工具类:http://flyouwith.iteye.com/blog/2206610  

线程池:http://flyouwith.iteye.com/blog/2206623

 

 Thread对象表示的线程和Runnable对象表示的线程所执行的任务之间是紧耦合的。这对于小型应用程序来说没问题,但对于大规模并发应用来说,合理的做法是将线程的创建与管理和程序的其他部分分离开。封装这些功能的对象就是执行器

 

  • 执行器接口定义了三种类型的执行器对象。
  • 线程池是最常见的一种执行器的实现。
  • Fork/Join是JDK 7中引入的并发框架。
java.util.concurrent中包括三个Executor接口: 

  • Executor,一个运行新任务的简单接口。
  • ExecutorService,扩展了Executor接口。添加了一些用来管理执行器生命周期和任务生命周期的方法。
  • ScheduledExecutorService,扩展了ExecutorService。支持Future和定期执行任务。
通常来说,指向Executor对象的变量应被声明为以上三种接口之一,而不是具体的实现类。 
 

 

 

 

 

java.util.concurrent.atomic

可以对boolean 、int、 long、引用(V value)进行原子操作。

采用CAS(compareAndSwap)比较 交换的策略。原子操作,当且紧当内存地址中的值符合旧的预期值时,处理器用新值更新旧值。

 

 

java.util.concurrent.locks

        一种简单的可重入锁它们有能力收回获得锁的尝试。如果当前锁对象不可用,或者锁请求超时(如果超时时间已指定),tryLock方法会收回获取锁的请求。如果在锁获取前,另一个线程发送了一个中断,lockInterruptibly方法也会收回获取锁的请求

 

public class RunMain {

	static class Test {

		private Lock lock = new ReentrantLock();

		/**
		 * 获得锁
		 */
		public boolean isLock(Test t) {
			boolean b1 = false;
			boolean b2 = false;
			try {
				b1 = lock.tryLock();
				b2 = t.lock.tryLock();
			} finally {
				if (!(b1 && b2)) {
					if (b1)
						lock.unlock();
					if (b2)
						t.lock.unlock();
				}

			}
			return b1 && b2;
		}

		public void method1(Test t) {
			if (isLock(t)) {
				try {
					t.method2();
				} finally {
					System.err.println("执行成功释放锁");
					t.lock.unlock();
					lock.unlock();
				}
			}else{
				System.out.println("没有获得锁");
			}
		}

		public void method2() {
			System.err.println("-------");
		}
	}

	static class ThreadRun implements Runnable {

		private Test test;
		private Test test2;

		public ThreadRun(Test test, Test test2) {
			this.test = test;
			this.test2 = test2;
		}

		Random random = new Random();
		
		@Override
		public void run() {
			while(true){
				try{
					Thread.sleep(random.nextInt(10));
				}catch(InterruptedException e){}
				test.method1(test2);
			}
		}
	}

	public static void main(String[] args) {
		Test test1 = new Test();
		Test test2 = new Test();
		Thread t1 = new Thread(new ThreadRun(test1, test2));
		Thread t2 = new Thread(new ThreadRun(test2, test1));
		t1.start();
		t2.start();
		
	}
}

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    java并发编程实战中文加英文版加源码

    JAVA并发编程实践中文版 英文版 原书源码 带书签 java_concurrency_in_practice.pdf 英文版还是不错的,但是中文版的译者典型的没有技术功底,介绍上说什么专家, 翻译的非常差劲,有些句子都不通顺,都不知道自己去...

    java并发编程实践高清中文版+源码

    《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...

    java并发编程实战源码,java并发编程实战pdf,Java

    java并发编程实战源码 附有本书所有源码,maven 导入 eclipse或idea

    java并发编程2

    java并发编程pdf文档第二部分:Java并发编程实战.pdf、Java多线程编程核心技术.pdf、实战Java高并发程序设计.pdf

    JAVA并发编程艺术 高清pdf

    JAVA并发编程艺术 高清pdf : 1.并发变成的挑战 2. java并发机制的底层实现原理 3. java 内存模型 4. java并发编程基础 5.java中的锁。。。。。。。

    java并发编程艺术

    java并发编程艺术java并发编程艺术java并发编程艺术java并发编程艺术java并发编程艺术

    JAVA并发编程实践

    《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...

    (PDF带目录)《Java 并发编程实战》,java并发实战,并发

    这就是最正宗的《Java 并发编程实战》带目录 用福昕阅读器打开查看特别的清晰

    java并发编程内部分享PPT

    java并发编程内部分享PPT

    java并发编程与实践

    java并发编程与实践是java高并发的分析文档,分析并介绍了高并发的解决方案。

    《java 并发编程实战高清PDF版》

    深入讲解java并发编程技术,多线程、锁以及java内存模型等

    JAVA并发编程实践 .pdf

    《Java并发编程实战》深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证...

    java 并发编程的艺术pdf清晰完整版 源码

    java 并发编程的艺术pdf清晰完整版 源码

    Java 并发编程实战.pdf

    《java并发编程实战》是java并发的圣经。亲自整理目录结构,层级分明(福昕阅读器整理)。高清。

    JAVA并发编程实践 带书签

    本书深入浅出地介绍了Java线程和并发,是一本完美的Java并发参考手册。书中从并发性和线程安全性的基本概念出发,介绍了如何使用类库提供的基本并发构建块,用于避免并发危险、构造线程安全的类及验证线程安全的规则...

    java并发编程(阿里巴巴)pdf

    JAVA并发编程(阿里巴巴培训资料) Java 并发编程培训(阿里巴巴) ppt 文档。

    Java并发.pdf

    Java并发

    java并发工具包 java.util.concurrent中文版用户指南pdf

    1. java.util.concurrent - Java 并发工具包 2. 阻塞队列 BlockingQueue 3. 数组阻塞队列 ArrayBlockingQueue 4. 延迟队列 DelayQueue 5. 链阻塞队列 LinkedBlockingQueue 6. 具有优先级的阻塞队列 ...

    java并发编程从入门到精通

    《Java并发编程从入门到精通》作者结合自己10多年Java并发编程经验,详细介绍了Java并发编程的基础概念、工作原理、编程技巧和注意事项,对Java高性能高并发编程有极大的参考价值。 《Java并发编程从入门到精通》...

Global site tag (gtag.js) - Google Analytics