目录
多线程同步
synchronized(同步锁)
介绍:
-
synchronized的作用是保证在同一时刻, 被修饰的代码块或方法只会有一个线程执行,以达到保证并发安全的效果。
-
synchronized是Java中解决并发问题的一种最常用的方法,也是最简单的一种方法。
使用方式:
-
修饰代码块:指定加锁对象,对给定对象加锁
-
修饰实例方法:作用于当前实例加锁
-
修饰静态方法:作用于当前类加锁
synchronized同步块
使用格式:
synchronized(对象){//代码块的内容 同一时刻只能一个线程进来 对象只要保证是唯一的就可以 //需要同步的代码 }
注意:一般把变量被修改的部分放在代码块中
同步方法—非静态方法
-
synchronized加在非静态方法表示同步对象锁:同一时刻只运行一个线程的对象访问该同步方法,其他线程等待当前线程执行完毕交还锁才能访问该同步方法
-
给非静态方法加上synchronized修饰,在Thread中调用被修饰过的方法
-
必须是同一个对象调用才能发挥作用,如果定义两个对象,各自调用方法则不能同步
同步方法—静态方法
-
类名.被synchronized修饰的方法
-
如果创建了对象,也可以通过对象调用,但实际还是通过类来调用,即使创建了两个对象来调用依然可以实现同步
死锁
当两个线程(或更多)线程(或线程)相互持有对方所需要的资源,又不主动释放,导致所有线程都无法继续执行,使程序陷入无尽的阻塞
生产者消费者
多个同步方法能按照先后顺序交替执行
方法:
-
wait():使当前线程进入等待状态, 并且会释放锁
-
notify():随机唤醒一个处于wait状态的线程
-
notifyAll:唤醒所有处于wait状态的线程
生产者:负责生成数据
消费者:负责消费生成的数据
public class Product { Integer num; boolean flag=true; public synchronized void provider(int num){//生产者:负责生成数据 if(!flag){ try { wait(); } catch (InterruptedException e) { throw new RuntimeException(e); } } System.out.println("生产者正在生产......"); this.num=num; flag=false;