返回顶部
首页 > 资讯 > 精选 >Java多线程面试题实例分析
  • 729
分享到

Java多线程面试题实例分析

2023-06-29 10:06:13 729人浏览 八月长安
摘要

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

这篇文章主要介绍了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多线程面试题实例分析”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网精选频道。

--结束END--

本文标题: Java多线程面试题实例分析

本文链接: https://lsjlt.com/news/324386.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java多线程面试题实例分析
    这篇文章主要介绍了Java多线程面试题实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java多线程面试题实例分析文章都会有所收获,下面我们一起来看看吧。问题一A线程正在执行一个对象中的同步方法,B线程是...
    99+
    2023-06-29
  • 高价值Java多线程面试题分析
    问题一 A线程正在执行一个对象中的同步方法,B线程是否可以同时执行同一个对象中的非同步方法? 可以,两个线程运行所需资源不同,不需要抢占。 案例一、 package duoxian...
    99+
    2024-04-02
  • java多线程面试题目
    什么是线程?线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。 (推荐学习:java面试题目)比如,如果一个线程完成一个...
    99+
    2020-08-31
    java面试题 java
  • Java并发面试题实例分析
    这篇文章主要讲解了“Java并发面试题实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java并发面试题实例分析”吧!题目结论多线程并发的同时进行set、get操作, A线程...
    99+
    2023-06-05
  • Java多线程面试题(面试官常问)
    进程和线程 进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是从一个进程从创建、运行到消亡的过程。在Java中,当我们启动main函数时其实...
    99+
    2024-04-02
  • JAVA多线程编程实例分析
    今天小编给大家分享一下JAVA多线程编程实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1.三个售票窗口同时出售20张...
    99+
    2023-06-27
  • Python面试题实例分析
    这篇文章主要介绍“Python面试题实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python面试题实例分析”文章能帮助大家解决问题。一、类继承问题:有如下的一段代码:如何调用类 A 的 s...
    99+
    2023-06-17
  • HTML5面试题实例分析
    这篇文章主要介绍“HTML5面试题实例分析”,在日常操作中,相信很多人在HTML5面试题实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”HTML5面试题实例分析”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-03
  • java的多线程常见面试题
    并行和并发有什么区别? (推荐学习:java常见面试题)并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。...
    99+
    2018-11-10
    java面试题 java
  • Java 多线程中stop停止线程实例分析
    这期内容当中小编将会给大家带来有关Java 多线程中stop停止线程实例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。package com.stop;import java.ut...
    99+
    2023-06-02
  • Java多线程中线程安全问题的示例分析
    这篇文章主要介绍了Java多线程中线程安全问题的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 什么是线程安全和线程不安全?什么是线程安全呢?当多个线程并发访问某...
    99+
    2023-06-29
  • Java线程同步问题实例分析
    这篇文章主要讲解了“Java线程同步问题实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java线程同步问题实例分析”吧!1.场景有五位沉默的哲学家围坐在一张圆桌旁,他们一生都在吃东西...
    99+
    2023-06-29
  • Java经典面试题汇总--多线程
    目录1.并行和并发有什么区别?2.线程和进程的区别?3.守护线程是什么?4.实现多线程的方式有哪些?5.说一下runnable和callable有什么区别?6.sleep()和wai...
    99+
    2024-04-02
  • Java经典面试题汇总:多线程
    目录1. 并行和并发有什么区别?2.线程和进程的区别?3.守护线程是什么?4.实现多线程的方式有哪些?5.说一下runnable和callable有什么区别?6.sleep...
    99+
    2024-04-02
  • Java中多线程面试题有哪些
    这篇文章将为大家详细讲解有关Java中多线程面试题有哪些,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。进程和线程进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是从...
    99+
    2023-06-14
  • Java多线程同步问题的示例分析
    这篇文章主要介绍Java多线程同步问题的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!简单了解下在操作系统中进程和线程的区别:  进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开...
    99+
    2023-05-30
    java
  • Java深入分析链表面试实例题目
    目录链表面试题一问题描述:问题分析:问题讲解:代码实现:链表面试题二问题描述:问题分析:问题讲解:代码实现:链表面试题一 判断链表是否是回文结构。 问题描述: 兄弟们,看图理解什么是...
    99+
    2024-04-02
  • Java线程实例分析
    今天小编给大家分享一下Java线程实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。启动一个线程T1=new YourT...
    99+
    2023-06-03
  • Java多线程的示例分析
    这篇文章给大家分享的是有关Java多线程的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。线程的创建继承Thread实现Runnable实现Callable使用继承Thread类来开发多线程的应用程序在设计...
    99+
    2023-06-20
  • Python多线程实例分析
    这篇文章主要介绍“Python多线程实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python多线程实例分析”文章能帮助大家解决问题。线程讲解  多线程类似于同时执行多个不同程序,多线程运行...
    99+
    2023-06-29
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作