能够写出高伸缩性的并发是一门艺术
在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中引入的并发框架。
- Executor,一个运行新任务的简单接口。
- ExecutorService,扩展了Executor接口。添加了一些用来管理执行器生命周期和任务生命周期的方法。
- ScheduledExecutorService,扩展了ExecutorService。支持Future和定期执行任务。
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平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。以下是对标题和描述中所提及的几个知识点的详细解释: 1. **线程与并发** - **线程*...
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。这份“java并发编程内部分享PPT”显然是一个深入探讨这一主题的资料,旨在帮助开发者...
《Java并发编程实战》这本书是关于Java语言中并发编程技术的经典著作。它详细介绍了如何在Java环境中有效地实现多线程程序和并发控制机制。在Java平台上,由于其本身提供了强大的并发编程支持,因此,掌握并发编程...
《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南。这本书旨在帮助开发者理解和掌握在Java环境中创建高效、可扩展且可靠的多线程应用程序的关键技术和实践。它涵盖了从基本概念到高级主题的广泛内容,...
### Java并发编程实战知识点概述 #### 一、Java并发特性详解 在《Java并发编程实战》这本书中,作者深入浅出地介绍了Java 5.0和Java 6中新增的并发特性。这些特性旨在帮助开发者更高效、安全地编写多线程程序。书中...
JAVA并发编程实践中文版 英文版 原书源码 带书签 java_concurrency_in_practice.pdf 英文版还是不错的,但是中文版的译者典型的没有技术功底,介绍上说什么专家, 翻译的非常差劲,有些句子都不通顺,都不知道自己去...
《Java 并发编程实战》是一本专注于Java并发编程的权威指南,对于任何希望深入了解Java多线程和并发控制机制的开发者来说,都是不可或缺的参考资料。这本书深入浅出地介绍了如何在Java环境中有效地管理和控制并发...
《Java并发编程艺术》这本书深入探讨了Java平台上的并发编程技术。并发编程是现代多核处理器环境下提升软件性能的关键手段,而Java语言提供了丰富的工具和API来支持这一领域。本书旨在帮助开发者理解和掌握如何在...
《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...
《JAVA并发编程实践》随着多核处理器的普及,使用并发成为构建高性能应用程序的关键。Java 5以及6在开发并发程序中取得了显著的进步,提高了Java虚拟机的性能以及并发类的可伸缩性,并加入了丰富的新并发构建块。在...
《Java并发编程的艺术》这本书是Java开发者深入理解并发编程的重要参考书籍。这本书全面地介绍了Java平台上的并发和多线程编程技术,旨在帮助开发者解决在实际工作中遇到的并发问题,提高程序的性能和可伸缩性。 ...
"Java并发编程与实践"文档深入剖析了这一主题,旨在帮助开发者理解和掌握如何在Java环境中有效地实现并发。 并发是指在单个执行单元(如CPU)中同时执行两个或更多任务的能力。在Java中,这主要通过线程来实现,...
《JAVA并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。它涵盖了Java并发的核心概念、工具和最佳实践,旨在帮助读者在多线程环境下编写高效、安全的代码。 并发编程是现代软件开发中的关键技能,...
#### 一、Java并发概述 自Java诞生之初,其设计者就赋予了该语言强大的并发处理能力。Java语言内置了对线程和锁的支持,这使得开发者能够轻松地编写多线程应用程序。本文旨在帮助Java开发者深入理解并发的核心概念...
Java并发编程是软件开发中的一个关键领域,尤其是在大型企业级应用和分布式系统中。通过学习相关的书籍,开发者可以深入理解如何有效地设计和实现高效的多线程应用程序,避免并发问题,如竞态条件、死锁、活锁等。...
Java并发编程实践是Java开发中不可或缺的一个领域,它涉及到如何高效、正确地处理多线程环境中的任务。这本书的读书笔记涵盖了多个关键知识点,旨在帮助读者深入理解Java并发编程的核心概念。 1. **线程和进程的...
《Java并发编程实践》是一本深入探讨Java多线程编程的经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和David Holmes等专家共同编写。这本书全面介绍了Java平台上的并发编程技术,是Java开发...