一、什么是线程
基础知识。线程是CPU调度的最小单元。一个线程可以看作是在执行一个任务。除创建和销毁,线程的生命周期还包括就绪、运行、阻塞。
二、多线程的工作原理
CPU是按时间片来运行任务的,多个线程都有机会获得时间片,这样多个任务就可以并发地执行。线程间的切换会涉及到上下文保存的开销。由于线程间共享进程内的数据资源,故线程切换的开销比进程切换的开销要小很多。在大多数通用的处理器中,上下文切换的开销相当于5000到10000个时钟周期。
因为大多时候一个线程不可能满负荷地占用CPU,会有一些IO或接口调用的操作,这个时候CPU是空闲的,就可以切换别的线程执行,从而大大地提高效率和并发量。
三、如何使用多线程
创建并启动多个线程就可以实现多线程,你大致可以通过以下三种方式:
new Thread(Runnable).start();
ExecutorService.execute(Runnable);
Future<?> = ExecutorService.submit(Callable<?>);
如何获得ExecutorService,如下。区别很明显,具体含义参见API。
Executors.newSingleThreadExecutor();
Executors.newCachedThreadPool();
Executors.newFixedThreadPool(nThreads);
Executors.newScheduledThreadPool(corePoolSize);
除了简单的创建并启动,你还可以通过ScheduledExecutorService来调度你的线程,你可以让线程等待多长时间启动,并多久循环,使用很简单,具体参见API。
四、多线程带来的问题
除线程切换开销外,最大的问题就是多个线程竞争共享资源时,可能会破坏共享资源,因为很多操作都不是原子的。比如A正在写共享资源G,可能还未写完B就来读,得到不正确的G;可能B读完还要写入,导致G被破坏。即使能保证共享资源不被破坏,也可能根据共享状态作判断的时候取不到正确时机的状态而判断错误。比如A在时刻1取到共享状态G为true,当执行过程中可能G被B修改为了false,A后续依赖B为true的操作将是错误的。
为了解决线程安全,程序设计会变得复杂,同时避免不了对共享资源进行锁定,这样阻塞会更频繁,可能还会死锁。死锁的四个必要条件:互斥、持有并等待、非抢占式、循环等待。
总之,多线程会给你带来莫名其妙的问题,状态出错、数据出错、或者偶尔的性能下降。
五、如何保证线程安全
1. 线程内部的资源是线程安全的。
2. 只读资源是线程安全的。
3. 对共享资源操作方法或代码块使用同步synchronized,保证同一时刻只有一个线程访问共享资源,是线程安全的。
4. 当一个线程将对共享资源进行写操作时或者后续操作依赖读操作的结果时,先获取资源的锁(trylock),对资源进行锁定,操作完后释放锁,可以保证线程安全。
六、多线程优化思路
逐步从以下几个方面去考虑:
1. 是否一定要使用多线程,是否一定要共享资源。
2. 避免热点域成为共享的竞争资源。
3. 避免使用独占锁,寻找可行的替代方式,如依赖concurrent包中的数据结构(最好了解其实现),采用读写锁等。
4. 避免对大段操作加锁,缩小锁的范围,快进快出。
5. 避免对大量数据加锁,减少锁的粒度,进行分拆和分离。
6. 监控CPU利用率、内存占有和释放情况(GC)来进行分析。
文章首发于:www.newhottopic.com
相关推荐
java多线程程序设计代码.zip实验五 java多线程程序设计代码.zip实验五 java多线程程序设计代码.zip实验五 java多线程程序设计代码.zip实验五 java多线程程序设计代码.zip实验五 java多线程程序设计代码.zip实验五 ...
Java多线程程序设计是Java开发中的重要领域,它允许应用程序同时执行多个任务,从而提高系统资源的利用率和程序的响应速度。在Java中,多线程主要通过两种方式实现:继承Thread类和实现Runnable接口。 一、创建线程...
Java多线程程序设计详细解析,详细介绍了多线程的方方面面,是java备考和面试宝典
Java多线程程序设计是Java开发中的重要组成部分,它允许程序在同一时间执行多个任务,从而提高了系统的效率和响应性。本文将深入探讨Java多线程的相关概念和实现方式。 一、理解多线程 1. **线程定义**:线程是一...
Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式上传文件Java多线程设计模式...
深入浅出Java多线程程序设计说明,深入浅出Java多线程程序设计说明,深入浅出Java多线程程序设计说明,深入浅出Java多线程程序设计说明,深入浅出Java多线程程序设计说明
《POSIX多线程程序设计》深入描述了IEEE的开放系统接口标准——POSIX线程,通常称为Pthreads标准。本书首先解释了线程的基本概念,包括异步编程、线程的生命周期和同步机制;然后讨论了一些高级话题,包括属性对象、...
(注意,本资源附带书中源代码可供参考) 多线程与并发处理是程序设计好坏优劣的重要课题,本书通过浅显易懂的文字与实例来介绍Java线程相关的设计模式概念,并且通过实际的Java程序范例和 UML图示来一一解说,书中...
Java多线程程序设计是Java开发中的重要概念,它允许在一个程序中同时执行多个任务,提高了应用程序的效率和响应性。在Java中,有两种主要的方式来实现多线程:继承Thread类和实现Runnable接口。 首先,我们要理解多...
本知识点将深入探讨Java多线程设计以及如何利用“不可变对象”(immutable objects)来避免多线程环境中的非安全问题。 一、Java多线程基础 1. 线程的创建:Java提供了两种创建线程的方式——继承Thread类和实现...
Java多线程程序设计是Java开发中的重要领域,它允许应用程序同时执行多个任务,从而提高系统资源利用率和程序性能。本教程将深入探讨Java多线程的各个方面,旨在帮助开发者熟练掌握这一关键技术。 首先,我们要了解...
下面将详细讲解Java多线程的相关概念、创建线程的方式以及线程同步和调度。 5.1 相关概念: 1. **程序**:一组指令的集合,用于完成特定的任务。 2. **进程**:操作系统中执行程序的实例,每个进程都有自己的内存...
java多线程程序设计:Java NIO+多线程实现聊天室 Java基于多线程和NIO实现聊天室 涉及到的技术点 线程池ThreadPoolExecutor 阻塞队列BlockingQueue,生产者消费者模式 Selector Channel ByteBuffer ProtoStuff 高...
本文将基于一个具体的Java多线程操作数据库的应用程序,深入探讨其背后的原理、实现细节以及潜在的挑战。 #### 核心知识点: 1. **多线程基础**:多线程是Java编程中的一个重要概念,允许程序同时执行多个任务。在...
Java多线程程序设计是Java编程中的一个重要组成部分,它允许开发者创建多个线程来执行不同的任务,从而提高程序的执行效率和改善用户体验。本文将详细探讨Java多线程程序设计的关键知识点,包括线程的创建与管理、...
Java 多线程程序设计教程 本教程旨在帮助读者理解 Java 中的多线程程序设计。多线程是指允许在程序中并发执行多个指令流,每个指令流称为一个线程,彼此间相互独立。线程又称为轻量级进程,它和进程一样拥有独立的...