Lock
Java5的concurrent包引入的接口: java.util.concurrent.locks,其功能与synchronize类似,在开始代码处调用lock() 方法获取锁,在结尾处调用unlock()释放锁。
public class MainClass { private Lock lock; private Object shared; public void operation() { lock.lock(); //获得锁,如果无法得到,线程将进入不可中断的等待状态 try { operate( shared ); //操作共享资源 } finally { lock.unlock(); //释放锁 } } }
lock接口比synchronize关键字提供了更加细致的控制方法,它提供了一下方法
- lock() : 获取锁
- tryLock() :尝试获取锁,如果未获取锁直接返回false,不进行等待
- tryLock( Long time,TimeUnit unit ) : 尝试获取锁,如果获取不成功进行等待,在等待的时长中获取到锁,返回true,否则返回false 。可以响应中断异常
- lockinterruptibly():尝试获取锁,无法获取锁时进行等待,线程出于等待时,可以调用interrupt方法中断线程的等待过程。
- unlock():释放锁
- newCondition() :创建一个与此锁关联的Condition对象,Condition可以代替Object.wait / signal / notify / notifyAll
- 可重入锁:如果当先线程已经持有锁L,那么调用另外一个需要该锁的方法时,不需重新的释放锁在获取锁,而是在当前锁的计数上++,退出该方法是在锁的计数上--。这于synchronize关键字的语意一致。不是所有的lock的实现都支持可重入语义,ReentrantLock提供一下方法:
- 公平锁:尽可能的按照线程的请求顺序来获取锁,即等待时间长的线程先获取锁,这样可以避免饥饿现象出现。new ReentrantLock(true) 可以构建公平锁,它基本上是按照先入先出的顺序来服务锁的请求者。开发者可以实现锁类来实现其他公平锁的策略。synchronize就是非公平锁。
- 读写锁: 读写锁将锁的临界资源分成连个部分,一个读锁和一个写锁,正因为有了读写锁,才使得多线程下的读操作不会发生冲突。ReadWriteLock就是读写锁,它是一个接口,ReentrantReadWriteLock是它的实现,readLock()是获取读锁,WriteLock()是获取写锁。在没有写锁的情况下,多个线程可以同时获取读锁,但是当有读锁或者写锁时,线程在获取写锁的时候必须等待其余线程将锁释放掉才能获取。
- 语句重排:JVM在不影响语义的情况下对语句进行重排。这种重排是不考虑并发的。
private int i; private int j; public void set() { //下面两个语句的顺序JVM可以重排 i = 0; j = 1; //该语句可以重排到该方法的任何地方 if ( i == 0 ) //i = 0的指令必须在这一句前面 i = 1; }
这种指令重排可能导致多线程下结果和预期不符。因此不要依靠代码的顺序来避免同步,典型的反例是双重检查惯例,synchronize关键字可以防止指令重排。
JSR-133中,volatile语义加强,禁止了volatile变量和普通变量之间的重排序。因此在Java5后,volatile和synchronize具有一样的语义--针对单个变量的读写锁。
Atomic类
Java5的concurrent包引入了若干atomic类,这些类支持原子的方式进行操作,可以避免同步,提高性能。
Atomic家族内部实现上使用了一种乐观锁的机制:假设当前线没有被其他线程修个的共享变量,并计算变量和新值,在尝试更新变量时,检查是否有其他线程修个该值,如果有,获取新值,重复上面的计算。
线程的优先级
- 线程优先级1-10,数字越大优先级越高,默认的优先级为5
- 优先级无法保证线程的执行顺序,只不过优先级高的线程获取cpu执行的几率较大,优先级低的线程并非没有机会获取
- 由调度决定,程序中那个线程执行
- thread.setPriority()是用来设置线程优先级的
- 设置线程的优先级应该在调用start()方法前
- 可以使用常量来设置线程的优先级,如:MIN_PRIORITY,MAX_PRIORITY,NORM_PRIORITY
yield 和join 方法的区别
yield() 是cpu当前执行的线程,让出cpu让等待的线程共同竞争cpu,当前线程有可能重现活的cpu使用权,继续执行
join() 是当前主线程进入waiting状态,等待子线程执行完毕后在进行执行。
线程状态
Initial : 初始化状态,从线程对象被调用一直到调用start()方法;
Runnable:线程可运行状态,线程调用start()方法后就处于该状态,JDK提供了好多方法可以让线程改变Runnable状态。处于该状态下的线程不一定占用cpu,某些情况对Runnable状态进行细分,Runnable是等待获取cpu,Running是已经获取了cpu正在执行。
Blocked:线程阻塞,处于该状态的线程不能运行,因为它在等待某种事件的发生(定时器、I/O)等。下列情况会进入阻塞状态:
线程等待I/O,如读取socket;
尝试进入一个被其它线程占据的临界区(Synchronize)受阻
尝试其它线程占据的Locked受阻
执行了线程Thread的 sleep()、join() 方法或者Object.wait()方法
在某些情况下,Blocked状态如下细分:
Blocked: 等待I/O 线程等待进入临界区;
Waiting: 调用Object.wait()方法;
Sleeping:调用Thread.sleep()方法;
Exiting: 一旦线程从run方法返回,或者线程调用stop方法,就进入该状态。某些情况下也程Dead状态。
相关推荐
《Java并发编程实战》是Java并发编程领域的一本经典著作,它深入浅出地介绍了如何在Java平台上进行高效的多线程编程。这本书的源码提供了丰富的示例,可以帮助读者更好地理解书中的理论知识并将其应用到实际项目中。...
│ 高并发编程第二阶段08讲、并发编程的三个重要概念,原子性,可见性,有序性.mp4 │ 高并发编程第二阶段09讲、指令重排序,happens-before规则精讲.mp4 │ 高并发编程第二阶段10讲、volatile关键字深入详解.mp4...
《Java并发编程实战》这本书是关于Java语言中并发编程技术的经典著作。它详细介绍了如何在Java环境中有效地实现多线程程序和并发控制机制。在Java平台上,由于其本身提供了强大的并发编程支持,因此,掌握并发编程...
《Java并发编程艺术》这本书深入探讨了Java平台上的并发编程技术。并发编程是现代多核处理器环境下提升软件性能的关键手段,而Java语言提供了丰富的工具和API来支持这一领域。本书旨在帮助开发者理解和掌握如何在...
Java并发编程是Java开发中的重要领域,特别是在多核处理器和分布式系统中,高效地利用并发可以极大地提升程序的性能和响应速度。以下是对标题和描述中所提及的几个知识点的详细解释: 1. **线程与并发** - **线程*...
Java高并发编程,构建并发编程知识体系,提升面试成功率,完整版17章视频教程下载。 本课程将结合大量图示及代码演示,带你掌握多线程并发编程(线程安全,线程调度,线程封闭,同步容器等)与高并发处理思路与手段...
《Java并发编程的艺术》这本书是Java开发者深入理解并发编程的重要参考书籍。这本书全面地介绍了Java平台上的并发和多线程编程技术,旨在帮助开发者解决在实际工作中遇到的并发问题,提高程序的性能和可伸缩性。 ...
《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南。这本书旨在帮助开发者理解和掌握在Java环境中创建高效、可扩展且可靠的多线程应用程序的关键技术和实践。它涵盖了从基本概念到高级主题的广泛内容,...
并发编程是计算机科学中的一个复杂领域,它涉及到同时运行多个任务,以提高程序的性能和效率。它在现代多核处理器和多处理器计算环境中尤其重要,因为这些环境允许并行执行多个计算。并发编程可以用于操作系统、...
《Java并发编程实战》是一本深入探讨Java平台并发编程的权威指南,由Tim Peierls等人与Brian Goetz合著,旨在帮助Java开发者理解和掌握在多线程环境中编写高效、安全的代码。这本书由拥有丰富经验的JDK并发大师及...
《Java并发编程实践》是一本深入探讨Java多线程编程的经典著作,由Brian Goetz、Tim Peierls、Joshua Bloch、Joseph Bowles和David Holmes等专家共同编写。这本书全面介绍了Java平台上的并发编程技术,是Java开发...
JAVA并发编程艺术 高清pdf : 1.并发变成的挑战 2. java并发机制的底层实现原理 3. java 内存模型 4. java并发编程基础 5.java中的锁。。。。。。。
Java并发编程中的多线程协作机制 在 Java 并发编程中,多线程协作机制是非常重要的一部分。多线程协作机制是指在多线程编程中,多个线程之间如何协作、同步和通信,以达到共同完成某个任务的目的。Java 提供了多种...
### C++并发编程实践 #### 一、简介与并发编程基础 《C++并发编程实践》这本书由Anthony Williams编写,是一本深入讲解C++多线程编程技术的专业书籍。本书旨在帮助读者掌握C++中的并发编程技巧,并通过大量的示例...
《JAVA并发编程实践》这本书是Java开发者深入理解并发编程的重要参考资料。它涵盖了Java并发的核心概念、工具和最佳实践,旨在帮助读者在多线程环境下编写高效、安全的代码。 并发编程是现代软件开发中的关键技能,...
并发编程中的三大特性:可见性、有序性和原子性,是多线程编程中主要的并发问题来源。这些特性是理解和规避并发编程中Bug的关键。 可见性问题是指,在多线程环境下,一个线程对共享变量的修改,其他线程可能无法...
《JAVA并发编程艺术》是Java开发者深入理解和掌握并发编程的一本重要著作,它涵盖了Java并发领域的核心概念和技术。这本书详细阐述了如何在多线程环境下有效地编写高效、可靠的代码,对于提升Java程序员的技能水平...
Java并发编程是软件开发中的一个关键领域,尤其是在大型企业级应用和分布式系统中。通过学习相关的书籍,开发者可以深入理解如何有效地设计和实现高效的多线程应用程序,避免并发问题,如竞态条件、死锁、活锁等。...