一、同步多线程
同步多线程是一种在一个CPU的时钟周期内能够执行来自多个线程的指令的硬件多线程技术。
线程同步控制:对多个线程共享的资源(的)状态进行的统一性控制。
二、关键字synchronized(同步)
同步的本质:
当线程调用时,资源(对象)会加锁的,当用完资源后,锁在打开。意味着同一时刻,只有一个线程可以使用方法。
synchronized块
private Object lock1 = new Object(); //成员变量的锁
private Object lock2 = new Object(); //成员变量的锁
public int getMoney1(){
//多个方法用同一把锁,多个方法一起排队
synchronized(lock1){ }
}
public int getMoney2(){
//多个方法用同不同锁,各个方法单独排队
synchronized(lock2 ){ }
}
synchronized不仅可以修饰方法,也可以修饰块。这两者的区别:
修饰方法是给对象(Class)加锁,如果有两个方法同步,则不能同时执行;
修饰块是给方法加锁,指同一个方法间的排队。
修饰方法时,只能用一个方法运行(排队)
如果两个方法用一把锁,那么两个方法只能一个进行;
如果两个方法不用同一把锁,那么两个方法互不影响,都可进行。
注:小面试题
private static Object lock1 = new Object();
//成员变量的锁
public synchronized static void abc(){
//这个锁的为.class的类文件
}
public synchronized void abc(){
//这个锁的是new的类对象
}
三、ReentrantLock类
一个可重用的互斥锁,实现Lock接口。Lock接口实现提供了比使用synchronized方法和语句可获得的更广泛的锁定操作。(可以取代synchroized关键字)
Lock的方法 lock(); //使用锁 unLock(); //解锁
代码举例:
private final ReentrantLock lock = new ReentrantLock();
//方法
public int getMethod(){
this.lock.lock();
//上锁
try{
//业务代码
}finally{
//解锁
this.lock.unlock();
}
}
四、java线程通信
基本概念:对被多个线程共享(共同使用、共同操作)的资源(对象),(由资源本身(这个对象))分配线程之间操作的调节与控制。
共享资源对象的方法:(注:不是线程的方法,是Object的方法)
1.wait(); //调用此对象的方法,使线程等待
2.notify(); //调用此对象的方法,唤醒一个线程
2.notifyAll(); //调用此对象的方法,唤醒所有线程