[面试题]sychronized关键字

1问题描述:

假设有testA,testB方法在Syn类中,这两个方法都被synchronized锁住,问:线程A和线程B是否可以同时运行?

class Syn {
    //    线程A进入testA(),线程A仍在执行
    public synchronized void testA() {
    }
//        线程B是否可以进入TestB()
        public synchronized void testB () {
           }
}

2分析:

可以给TestA()加一个死循环,使得线程A无限运行,TestB()加一条打印语句

1如果线程A运行,线程B被锁住不运行,那么没有输出

2如果两个线程同时运行,那么输出线程B中的打印语句

3代码:

package se.SE.practice;
class Syn {
    //    线程1进入testA(),线程1仍在执行
    public synchronized void testA() {
        if (Thread.currentThread().getName().equals("A")) {
            while (true) {
            }
        }
    }
//        线程2是否可以进入TestB()
        public synchronized void testB () {
            if (Thread.currentThread().getName().equals("B")) {
                System.out.println("线程B打印此方法");
            }
        }
}
class MyThread implements Runnable {
    private Syn syn;
    public  MyThread (Syn syn){
        this.syn=syn;
    }
    @Override
    public void run() {
        this.syn.testA();
        this.syn.testB();
    }
}
public class Thread1{
    public static void main(String[] args) throws InterruptedException {
        Syn syn=new Syn();
        MyThread myThread=new MyThread(syn);
        Thread thread=new Thread(myThread,"A");
        Thread thread1=new Thread(myThread,"B");
        thread.start();
        Thread.sleep(2000);//为了保证A先启动,线程A启动后进入休眠状态
        thread1.start();
    }
}

结果:(没有输出)

为了验证以上观点,我们对线程A解锁---去掉TestA的synchronized

输出:

线程B打印此方法

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值