JUC练习4——理解synchronized锁的对象
1,普通方法synchronized锁的是当前对象:
2,静态的synchronized方法锁的当前类对象
3,哪个线程先获取到锁,它就先执行。
4,类对象锁不会比普通对象锁先执行。
示例代码:
import java.util.concurrent.TimeUnit; public class JucTest2 { public static void main(String[] args) throws InterruptedException { Phone phone = new Phone(); Phone phone1 = new Phone(); new Thread(()->{phone.sendMsg();},"A").start();//拿到phone锁后,等待4秒,打印发短信 TimeUnit.SECONDS.sleep(1);//保证发短信方法先拿到phone对象锁 new Thread(()->{phone.call();},"B").start();//call()需要获取到phone锁,由于phone锁被sendMsg()占用所以需要等待它释放锁 new Thread(()->{phone1.call();},"B1").start();//直接拿到phone1锁,打印phone1打电话 new Thread(()->{phone.playGame();},"C").start();//普通方法没有锁直接执行,打印玩游戏 new Thread(()->{phone.QQ();},"D").start();//静态的synchronized方法锁的当前类对象,他先获取的锁所以先执行 new Thread(()->{phone1.WeChat();},"E").start();//由于没有拿到锁,所以需要等待QQ()方法执行完毕释放锁后,获取锁执行 } } class Phone { synchronized void sendMsg() { try { TimeUnit.SECONDS.sleep(4);//睡眠4秒,call方法正在等待sendMsg方法执行完毕,释放锁 } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"发短信"); } synchronized void call() { System.out.println(Thread.currentThread().getName()+"打电话"); } void playGame() { System.out.println(Thread.currentThread().getName()+"玩游戏"); } static synchronized void QQ() { try { TimeUnit.SECONDS.sleep(4); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"玩QQ"); } static synchronized void WeChat() { System.out.println(Thread.currentThread().getName()+"玩微信"); } }