文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java多线程面试题实例分析

2023-06-29 10:49

关注

这篇文章主要介绍了Java多线程面试题实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java多线程面试题实例分析文章都会有所收获,下面我们一起来看看吧。

问题一

A线程正在执行一个对象中的同步方法,B线程是否可以同时执行同一个对象中的非同步方法?

可以,两个线程运行所需资源不同,不需要抢占。

案例一、

package duoxiancheng2;public class Ms1 {    //A线程正在执行一个对象中的同步方法,B线程是否可以同时执行同一个对象中的非同步方法?    Object a = new Object();    public static void main(String[] args) {        var t = new Ms1();        new Thread(() -> t.a1()).start();//A线程        new Thread(() -> t.a2()).start();//B线程    }    void a1() {        synchronized (a) {            System.out.println("同步方法");        }    }    void a2() {        System.out.println("非同步方法");    }}

运行结果:

Java多线程面试题实例分析

问题二

同上,B线程是否可以同时执行同一个对象中的另一个同步方法?

不可以,两个线程执行需要一个共同资源,共同资源加了同步锁,同一时刻只能一个线程占用。

案例二、

package duoxiancheng2;import java.util.concurrent.TimeUnit;public class Ms2 {    //同上,B线程是否可以同时执行同一个对象中的另一个同步方法?    Object a = new Object();    public static void main(String[] args) {        var t = new Ms2();        new Thread(() -> t.a1()).start();//A线程        new Thread(() -> t.a2()).start();//B线程    }    void a1() {        synchronized (a) {            System.out.println("进入同步方法1");            try {                TimeUnit.SECONDS.sleep(10);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println("同步方法1结束");        }    }    void a2() {        synchronized (a) {            System.out.println("进入同步方法2");            try {                TimeUnit.SECONDS.sleep(10);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println("同步方法2结束");        }    }}

运行结果:

线程A先运行,占用资源。

Java多线程面试题实例分析

等线程A运行完释放资源后,线程B才可以进入执行

Java多线程面试题实例分析

线程B执行完

Java多线程面试题实例分析

问题三

线程抛出异常会释放锁吗?

会,线程出现异常抛出后立刻释放资源。

案例三、

package duoxiancheng2;import java.util.concurrent.TimeUnit;public class Ms3 {    //线程抛出异常会释放锁吗?    Object a = new Object();    public static void main(String[] args) {        var t = new Ms3();        new Thread(() -> t.a1()).start();//A线程        new Thread(() -> t.a2()).start();//B线程    }    void a1() {        int c = 3;        int b;        synchronized (a) {            System.out.println("进入同步方法1");            try {                b = c / 0;                System.out.println(b);                TimeUnit.SECONDS.sleep(10);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println("同步方法1结束");        }    }    void a2() {        synchronized (a) {            System.out.println("进入同步方法2");            try {                TimeUnit.SECONDS.sleep(10);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println("同步方法2结束");        }    }}

结果: 方法一出现异常,立刻释放资源。线程二开始执行

Java多线程面试题实例分析

问题四

写一个程序,证明AtomicInteger类比synchronized更高效

synchronized更高效

案例一

package duoxiancheng2;import java.util.concurrent.atomic.AtomicInteger;public class Ms4 {    AtomicInteger n = new AtomicInteger(10000);    int num = 10000;    public static void main(String[] args) {        var t = new Ms4();        new Thread(t::minus, "T1").start();        new Thread(t::minus, "T2").start();        new Thread(t::minus, "T3").start();        new Thread(t::minus, "T4").start();        new Thread(t::minus, "T5").start();        new Thread(t::minus, "T6").start();        new Thread(t::minus, "T7").start();        new Thread(t::minus, "T8").start();    }    void minus() {        var a = System.currentTimeMillis();        while (true) {                       synchronized (this) {                if (num > 0) {                    num--;                    System.out.printf("%s 售出一张票,剩余%d张票。 %n", Thread.currentThread().getName(), num);                } else {                    break;                }            }        }        var b = System.currentTimeMillis();        System.out.println(b - a);    }}

synchronized结果:

Java多线程面试题实例分析

AtomicInteger结果:

Java多线程面试题实例分析

问题五

写一个程序证明AtomXXX类的多个方法并不构成原子性

package demo16;import java.util.ArrayList;import java.util.List;import java.util.concurrent.atomic.AtomicInteger;public class T {    AtomicInteger count = new AtomicInteger(0);    void m() {        for (int i = 0; i < 10000; i++) {            if (count.get() < 100 && count.get() >= 0) { //如果未加锁,之间还会有其他线程插进来                count.incrementAndGet();            }        }    }    public static void main(String[] args) {        T t = new T();        List<Thread> threads = new ArrayList<>();        for (int i = 0; i < 10; i++) {            threads.add(new Thread(t::m, "thread" + i));        }        threads.forEach(Thread::start);        threads.forEach((o) -> {            try {                //join()方法阻塞调用此方法的线程,直到线程t完成,此线程再继续。通常用于在main()主线程内,等待其它线程完成再结束main()主线程。                o.join(); //相当于在main线程中同步o线程,o执行完了,main线程才有执行的机会            } catch (InterruptedException e) {                e.printStackTrace();            }        });        System.out.println(t.count);    }}

问题六

写一个程序,在main线程中启动100个线程,100个线程完成后,主线程打印“完成”

package cn.thread;import java.util.concurrent.CountDownLatch;public class T12 {    public static void main(String[] args) {        CountDownLatch latch = new CountDownLatch(100);        for (int i = 0; i < 100; i++) {            new Thread(() -> {                String tn = Thread.currentThread().getName();                System.out.printf("%s : 开始执行...%n", tn);                System.out.printf("%s : 执行完成,程序结束。%n", tn);                latch.countDown();            }, "T" + i).start();        }        try {            latch.await();        } catch (InterruptedException e) {            e.printStackTrace();        }        System.out.println("---------------------------------------");        System.out.println("100个线程执行完了。");        String tn = Thread.currentThread().getName();        System.out.printf("%s : 执行完成,程序结束。%n", tn);    }}

关于“Java多线程面试题实例分析”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Java多线程面试题实例分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯