多线程学习-基础(二)

本文详细解析了Java中的synchronized关键字,包括其对方法和代码块的使用方式,对象锁与类锁的区别,以及如何处理异常情况下的锁释放。还讨论了synchronized在继承中的表现以及与静态方法的关系。
摘要由CSDN通过智能技术生成

synchronized:

被synchronized修饰的方法为同步方法。

1.假如a对象的x方法被synchronized的修饰,y方法没有被修饰,那么在第一个线程访问x方法获取对象锁的时候,第二个线程不可以访问x方法,但是可以访问y方法。

也就是说,在某个线程已经获取一个对象的对象锁的情况,其他线程只能访问该对象的非synchronized方法,如果要访问,那么需要等待第一个线程执行synchronized方法结束释放锁之后进行争夺。

2.如果是一个类的两个对象,分别被不同的线程访问同一个syn方法,那么都可以访问,事实上两个对象创建了2个线程锁,两个对象之间不会相互干扰。

3.如果一个对象里面有多个synchronized方法,那么当一个线程进入某个synchronized方法获取对象锁的时候,这时候对象锁并没有释放,可以在该方法内部调用其他synchronized方法。

4.当一个线程获取了一个对象的对象锁,如果在运行过程中代码出现未捕获的异常,那么该线程锁占用的对象锁将会得到释放。

5.synchronized关键字不能被继承,如果父类的某个方法被synchronized修饰,该方法被子类重写,但是没有被synchronized修饰,那么子类的方法将不会有同步效果。


synchronized(非this对象other)

1.other对象为对象锁,当多个线程同时执行synchronized(other){}同步代码块呈同步效果。(两个线程一起访问同步代码块)。

2.当一个类中的方法为同步方法,这个类的对象作为其他类中synchronized方法的对象锁时,两者之间呈同步效果。


synchronized修饰静态方法,表示对当前的类上锁,类锁和对象锁是两种不同的锁,两者之间不会呈同步效果。


注:String对象的特性,由于“a”和“a”为同一个对象,所以在传入“a”为同步对象时呈现的是同步效果。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值