Thread A führt eine synchronisierte Methode in einem Objekt aus. Kann Thread B gleichzeitig asynchrone Methoden in demselben Objekt ausführen?
Ja, die beiden Threads erfordern zum Ausführen unterschiedliche Ressourcen und müssen nicht vorzeitig ausgeführt werden.
Fall 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("非同步方法"); } }
Operationsergebnisse:
Wie oben: Kann Thread B gleichzeitig eine andere Synchronisationsmethode im selben Objekt ausführen?
Nein, zwei Threads benötigen zur Ausführung eine gemeinsame Ressource. Die gemeinsame Ressource ist durch die Synchronisierung gesperrt und kann nur von einem Thread gleichzeitig belegt werden.
Fall 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结束"); } } }
Operationsergebnisse:
Thread A wird zuerst ausgeführt und belegt Ressourcen.
Nachdem Thread A die Ausführung beendet und Ressourcen freigibt, kann Thread B mit der Ausführung beginnen
Thread B beendet die Ausführung
Wird die Sperre aufgehoben, wenn ein Thread eine Ausnahme auslöst?
Ja, die Ressource wird sofort freigegeben, nachdem der Thread eine Ausnahme ausgelöst hat.
Fall 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结束"); } } }
Ergebnis: Sobald eine Ausnahme in der Methode auftritt, werden die Ressourcen sofort freigegeben. Thread zwei beginnt mit der Ausführung
Schreiben Sie ein Programm, um zu beweisen, dass die AtomicInteger-Klasse effizienter ist als synchronisiert.
synchronized ist effizienter Ganzzahlige Ergebnisse :
Frage 5
Schreiben Sie ein Programm, um zu beweisen, dass mehrere Methoden der AtomXXX-Klasse keine Atomizität darstellen
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); } }
Frage 6
Schreiben Sie ein Programm, um 100 Threads im Hauptthread zu starten , der Hauptthread gibt „Fertig“ aus
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); } }
Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Java-Multithreading-Interviewfragen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!