Synchronized同步锁:
非静态方法:锁住方法的调用者
静态方法:锁住当前类
创建Data类,里面有两个方法,
创建两个线程,调用data类的方法
此时的输出:先启动线程A,休眠一秒再启动线程B。B调用的func2直接出结果,A调用的func1等3秒再出结果。程序启动一秒后先输出2… 再过两秒输出1…
···········································································································
加上synchronized同步锁后,1…和2…再3秒以后同时输出。因为先调用func1方法,线程A会占用锁资源,线程B无法执行,只能等线程A执行完毕后才可以执行,因为fun1有三秒延迟,fun2无延迟,所以会出现等待3秒后同时输出的情况。
---------------------------------------------------------------------------------------------------------------------------------------------------
去掉func2的synchronized后,此时先输出2…再输出1… 因为线程B不需要等待线程A释放锁资源,可以直接执行。
---------------------------------------------------------------------------------------------------------------------------------------------------
当创建两个data对象时,再执行线程AB,此时不会出现争夺锁资源的现象。因为synchronized锁住的是当前方法的调用者,fun1的调用者是data1,func2的调用者是data2,所以不会争夺资源。 此时先输出2…2再输出1…
---------------------------------------------------------------------------------------------------------------------------------------------------
此时改为静态方法,线程AB,就需要等待锁资源,因为synchronized锁静态方法时,锁的是方法所在的类。
此时去掉func2的synchronized,也不需要等待资源。