Detailed explanation of Java multi-threading interview questions
Question 1
A thread is executing a synchronized method in an object. Can thread B execute a non-synchronized method in the same object at the same time?
Yes, the two threads require different resources to run and do not need to preempt.
Case 1,
package duoxiancheng2; /** * @author yeqv * @program A2 * @Classname Ms1 * @Date 2022/2/7 19:08 * @Email w16638771062@163.com */ 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("非同步方法"); } }
Run result:
Question 2
Same as above, can thread B be executed at the same time? Another synchronized method in the same object?
No, two threads need a common resource to execute. The common resource is synchronized and can only be occupied by one thread at the same time.
Case 2,
package duoxiancheng2; import java.util.concurrent.TimeUnit; /** * @author yeqv * @program A2 * @Classname Ms2 * @Date 2022/2/7 19:25 * @Email w16638771062@163.com */ 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结束"); } } }
Running result:
Thread A runs first and occupies resources.
After thread A finishes running and releases resources, thread B can enter execution
Thread B completes execution
Question 3
Will the lock be released if the thread throws an exception?
Yes, the resource will be released immediately after the thread throws an exception.
Case 3,
package duoxiancheng2; import java.util.concurrent.TimeUnit; /** * @author yeqv * @program A2 * @Classname Ms3 * @Date 2022/2/7 19:41 * @Email w16638771062@163.com */ 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结束"); } } }
Result: As soon as an exception occurs in the method, the resources will be released immediately. Thread two starts executing
Question four
Write a program to prove that the AtomicInteger class is more efficient than synchronized
synchronized is more efficient
Case 1
package duoxiancheng2; import java.util.concurrent.atomic.AtomicInteger; /** * @author yeqv * @program A2 * @Classname Ms4 * @Date 2022/2/7 20:04 * @Email w16638771062@163.com */ 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) { /* if (n.get() > 0) { n.decrementAndGet(); System.out.printf("%s 售出一张票,剩余%d张票。 %n", Thread.currentThread().getName(), n.get()); } else { break; }*/ 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 result:
AtomicInteger result:
Question 5
Write a program to prove that multiple methods of the AtomXXX class do not constitute atomicity
package demo16; import java.util.ArrayList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; /** * 写一个程序证明AtomXXX类的多个方法并不构成原子性 */ 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); } }
Question 6
Write a program to start 100 threads in the main thread, 100 After the thread completes, the main thread prints "Done"
package cn.thread; import java.util.concurrent.CountDownLatch; /** * 写一个程序,在main线程中启动100个线程,100个线程完成后,主线程打印“完成” * * @author webrx [webrx@126.com] * @version 1.0 * @since 16 */ 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); } }
The above is the detailed content of Detailed explanation of Java multi-threading interview questions. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

In this article, we have kept the most asked Java Spring Interview Questions with their detailed answers. So that you can crack the interview.

Java 8 introduces the Stream API, providing a powerful and expressive way to process data collections. However, a common question when using Stream is: How to break or return from a forEach operation? Traditional loops allow for early interruption or return, but Stream's forEach method does not directly support this method. This article will explain the reasons and explore alternative methods for implementing premature termination in Stream processing systems. Further reading: Java Stream API improvements Understand Stream forEach The forEach method is a terminal operation that performs one operation on each element in the Stream. Its design intention is

PHP is a scripting language widely used on the server side, especially suitable for web development. 1.PHP can embed HTML, process HTTP requests and responses, and supports a variety of databases. 2.PHP is used to generate dynamic web content, process form data, access databases, etc., with strong community support and open source resources. 3. PHP is an interpreted language, and the execution process includes lexical analysis, grammatical analysis, compilation and execution. 4.PHP can be combined with MySQL for advanced applications such as user registration systems. 5. When debugging PHP, you can use functions such as error_reporting() and var_dump(). 6. Optimize PHP code to use caching mechanisms, optimize database queries and use built-in functions. 7

PHP and Python each have their own advantages, and the choice should be based on project requirements. 1.PHP is suitable for web development, with simple syntax and high execution efficiency. 2. Python is suitable for data science and machine learning, with concise syntax and rich libraries.

Capsules are three-dimensional geometric figures, composed of a cylinder and a hemisphere at both ends. The volume of the capsule can be calculated by adding the volume of the cylinder and the volume of the hemisphere at both ends. This tutorial will discuss how to calculate the volume of a given capsule in Java using different methods. Capsule volume formula The formula for capsule volume is as follows: Capsule volume = Cylindrical volume Volume Two hemisphere volume in, r: The radius of the hemisphere. h: The height of the cylinder (excluding the hemisphere). Example 1 enter Radius = 5 units Height = 10 units Output Volume = 1570.8 cubic units explain Calculate volume using formula: Volume = π × r2 × h (4

PHP is suitable for web development, especially in rapid development and processing dynamic content, but is not good at data science and enterprise-level applications. Compared with Python, PHP has more advantages in web development, but is not as good as Python in the field of data science; compared with Java, PHP performs worse in enterprise-level applications, but is more flexible in web development; compared with JavaScript, PHP is more concise in back-end development, but is not as good as JavaScript in front-end development.

PHP and Python each have their own advantages and are suitable for different scenarios. 1.PHP is suitable for web development and provides built-in web servers and rich function libraries. 2. Python is suitable for data science and machine learning, with concise syntax and a powerful standard library. When choosing, it should be decided based on project requirements.

Java is a popular programming language that can be learned by both beginners and experienced developers. This tutorial starts with basic concepts and progresses through advanced topics. After installing the Java Development Kit, you can practice programming by creating a simple "Hello, World!" program. After you understand the code, use the command prompt to compile and run the program, and "Hello, World!" will be output on the console. Learning Java starts your programming journey, and as your mastery deepens, you can create more complex applications.
