互斥锁
大约 2 分钟
1、关于“互斥”和“同步”的概念
互斥 : 就是线程A访问了一组数据,线程BCD就不能同时访问这些数据,直到A停止访问了
同步 : 就是ABCD这些线程要约定一个执行的协调顺序,比如D要执行,B和C必须都得做完,而B和C要开始,A必须先得做完。
互斥 :就是不同线程通过竞争进入临界区(共享的数据和硬件资源),为了防止访问冲突,在有限的时间内只允许其中之一独占性的使用共享资源。如不允许同时写
同步 :关系则是多个线程彼此合作,通过一定的逻辑关系来共同完成一个任务。一般来说,同步关系中往往包含互斥,同时对临界区的资源会按照某种逻辑顺序进行访问。如先生产后使用
总的来说,两者的区别就是:
互斥是通过竞争对资源的独占使用,彼此之间不需要知道对方的存在,执行顺序是一个乱序。
同步是协调多个相互关联线程合作完synchronized不同用法锁对象说明
2、JAVA中synchronized和Lock是互斥锁
修饰在静态方法上,锁对象是当前类的Class对象
修饰在实例方法上,锁对象是当前实例对象
同步块中,锁对象是synchronized括号后面的对象成任务,彼此之间知道对方存在,执行顺序往往是有序的。
3、synchronized的用法
/** 如下demo的4个方法展示了不同使用方法下锁对象 **/
public class SynchronizedDemo {
private static final Object LOCK = new Object();
public static synchronized void s1(){
System.out.println("类同步方法,锁对象是当前Class对象");
}
public synchronized void s2() {
System.out.println("实例同步方法,锁对象是当前对象");
}
public void s3() {
synchronized (LOCK) {
System.out.println("同步块,锁对象是LOCK对象");
}
}
public void s4() {
synchronized (SynchronizedDemo.class) {
System.out.println("同步块,锁对象和静态同步方法的锁对象一样都是当前Class对象");
}
}
}