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()+"玩微信");
}
}
浙公网安备 33010602011771号