多线程之二 线程同步
来源:互联网 发布:淘宝怎么改库存 编辑:程序博客网 时间:2024/05/24 07:01
线程同步的7种方式
线程同步的5种方式
线程同步的3种方式
1.同步方法(synchronized)
由于java的每个对象都有一个内置锁,当用此关键字修饰方法时,内置锁会保护整个方法。在调用该方法前,需要获得内置锁,否则就处于阻塞状态。
内置锁是可以重入的,当某个线程试图获取一个由它自己持有的锁,这个请求会成功。
注:synchronized关键字也可以修饰静态方法,此时如果调用该静态方法,将会锁住整个类。
优点:简单,直观,代码可读性高
缺点:效率低
2.同步代码块(synchronized)
即有synchronized关键字修饰的语句块。被该关键字修饰的语句块会自动被加上内置锁,从而实现同步
注:同步是一种高开销的操作,因此应该尽量减少同步的内容。通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。
3.重入锁(ReentrantLock)
在JavaSE5.0中新增了一个java.util.concurrent包来支持同步。ReentrantLock类是可重入、互斥、实现了Lock接口的锁, 它与使用synchronized方法和快具有相同的基本行为和语义,并且扩展了其能力。重入锁可以完全替代synchronized关键字。在JDK5.0的早期版本中,重入锁的性能远远好于synchronized。但从JDK6.0版本开始,JDK在synchronized上做了大量优化,使得两者的差距并不大。-----《实战Java高并发程序设计》
重入锁并不是一种替代内置锁的方法,而是当内置锁不适用时,作为一种可选的高级功能。-----《实战Java高并发程序设计》P227
开发人员必须手动指定何时加锁,何时释放锁。正因如此,重入锁对逻辑控制的灵活性远远好于synchronized。
退出临界区时,必须记得释放锁,否则,其它线程就没有机会再访问临界区了。
ReenreantLock类的常用方法有:
ReentrantLock() : 创建一个ReentrantLock实例
lock() : 获得锁
unlock() : 释放锁
注:ReentrantLock()还有一个可以创建公平锁的构造方法,但由于能大幅度降低程序运行效率,不推荐使用
4.volatile
a.volatile关键字为域变量的访问提供了一种免锁机制
b.使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新
c.因此每次使用该域就要重新计算,而不是使用寄存器中的值
d.volatile不能保证原子性,也不能用来修饰final类型的变量
5.ThreadLocal
如果说加锁是解决同步的一种思路,那么ThreadLocal就是另外一种解决同步的思路。ThreadLocal为每个线程提供一个共享对象的副本,只有当前线程才能访问。这样一来,线程间就不存在竞争了。
6.信号量(Semaphore)
信号量为多线程协作提供了更为强大的控制方法。广义上说,信号量是对锁的扩展。无论是内部锁synchronized还是重入锁ReentrantLock,一次都只允许【一个】线程访问一个资源,而信号量却可以指定【多个】线程同时访问一个资源。
public class SemaphoreDemo { public static void main(String[] args) { // 线程池。信号量通常都是针对多个线程,直接使用线程池实现 ExecutorService exec = Executors.newCachedThreadPool(); final Semaphore semaphore = new Semaphore(2);//每次允许2个线程获得许可 // 模拟20个客户端访问 for (int i = 0; i < 20; i++) { final int num = i; Runnable run = new Runnable() { public void run() { try { // 获取许可 semaphore.acquire(); System.out.println("Accessing: " + num); Thread.sleep(3000); // 访问完后,释放 semaphore.release(); } catch (InterruptedException e) { } } }; exec.execute(run); } // 退出线程池 exec.shutdown(); }}
- 多线程之二 线程同步
- 多线程之二:线程同步
- 多线程教程之二---线程间同步
- 多线程教程之二---线程间同步
- 【多线程】多线程教程之二---线程间同步
- POSIX线程之二. 线程同步,属性和多线程
- java多线程(二)之线程安全和线程同步
- 多线程之线程同步
- 多线程之线程同步
- 多线程之线程同步
- 多线程之线程同步
- 多线程之线程同步
- 多线程之线程同步
- 多线程之线程同步
- 多线程之线程同步
- 多线程(二)--线程同步
- C#多线程学习笔记(二)之线程同步
- java多线程总结(二)之线程同步篇
- 在PHP中执行shell命令
- POJ 3565 KM算法 题库221
- php——学习笔记,预定义常量
- Java-IO
- PDF转换器PDF文件格式转换
- 多线程之二 线程同步
- VC汇编(二)
- JAVAFX ComboBox的选中事件
- LeetCode OJ - Word Search *
- Linux下多线程编程简单示例
- CSDN写博客
- 多线程之一 多线程实现的三种方式
- 虚拟机无法联网解决方法
- 多线程3