本文共 2048 字,大约阅读时间需要 6 分钟。
大家在学习java多线程的时候肯定会遇到这个问题,而且在面试的时候也可能会谈到java多线程这一块的知识。今天我们就来看看这个东西~~~
synchronized 这个是对类实例进行加锁,可以简称为“实例锁”或者是“对象锁”。当某个线程调用synchronized方法的时候,就会给它加上了一个锁,其他线程就会无法访问,等到这个锁被释放,别的线程拿到这个锁的时候,才可以访问该方法。
static synchronized这个是“全局锁”或者是“类锁”,该锁针对的是类,不管实例了多少个对象,线程都共享该锁。
下面我们来看代码:
import java.util.concurrent.TimeUnit;public class Test { public static void main(String[] args) { Phone phone1 = new Phone(); Phone phone2 = new Phone(); //这里使用的是lambda表达式 new Thread(() -> { phone1.listening(); }, "A线程").start(); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } new Thread(() -> { phone2.reading(); }, "B线程").start(); }}class Phone{ public static synchronized void listening() { try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("该手机正在播放音乐~"); } public static synchronized void reading() { System.out.println("该手机正在显示电子书~"); }}
运行结果是:
但是当我把reading方法上的static 这个关键字去掉后,代码是这样的 :import java.util.concurrent.TimeUnit;public class Test { public static void main(String[] args) { Phone phone1 = new Phone(); Phone phone2 = new Phone(); //这里使用的是lambda表达式 new Thread(() -> { phone1.listening(); }, "A线程").start(); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } new Thread(() -> { phone2.reading(); }, "B线程").start(); }}class Phone{ public static synchronized void listening() { try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("该手机正在播放音乐~"); } public synchronized void reading() { System.out.println("该手机正在显示电子书~"); }}
结果是:
好了,大家在仔细品品~~~转载地址:http://djlwi.baihongyu.com/