java面试题(下)

Posted ws563573095

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java面试题(下)相关的知识,希望对你有一定的参考价值。

1、多个线程访问同一资源时如何保证线程之间访问的顺序性。

a、方案一

 1 package com.xiyao.opensource.java.lang;
 2 
 3 public class ThreadT {
 4 
 5     /**
 6      * 1、volatile修改,保持signal在多线程之间的可见性
 7      * 2、对象监视器就像是一个绳子,使用这个监视器的都是一条绳上的蚂蚱
 8      * 3、为了保持一直活动下去,一个蚂蚱休息前一定要唤醒别的至少一个蚂蚱
 9      */
10     volatile static Object signal = new Object();
11     
12     public static void main(String[] args) {
13         Thread thread = new Thread() {
14             @Override
15             public void run() {
16                 while(true) {
17                     try {
18                         Thread.sleep(1000L);
19                             /**
20                              * 1、notify和wait必须使用在synchronized中
21                              * 2、他们都是操作对象监视器,synchronized指明了对象监视器对象
22                              */
23                             synchronized(signal) {
24                                 System.out.println(Thread.currentThread().getName()+" 我执行完了!");
25                                 signal.notify();
26                                 signal.wait();
27                             }
28                     } catch (InterruptedException e) {
29                         e.printStackTrace();
30                     }
31                 }
32             }
33             
34         };
35         thread.start();
36         while(true) {
37             try {
38                 Thread.sleep(1000L);
39                     synchronized(signal) {
40                         System.out.println(Thread.currentThread().getName()+" 我执行完了!");
41                         signal.notify();
42                         signal.wait();
43                     }
44             } catch (InterruptedException e) {
45                 e.printStackTrace();
46             }
47         }
48     }
49     50 }

方案二

 1 package com.xiyao.opensource.java.util.concurrent;
 2 
 3 import java.util.concurrent.locks.Condition;
 4 import java.util.concurrent.locks.Lock;
 5 import java.util.concurrent.locks.ReentrantLock;
 6 
 7 public class LockT {
 8 
 9     public static void main(String[] args) {
10         Lock lock = new ReentrantLock();
11         //派生出多个条件(每个都是一个信号量)
12         Condition signalOne = lock.newCondition();
13         Condition signalTwo = lock.newCondition();
14         Thread thread = new Thread() {
15             @Override
16             public void run() {
17                 while(true) {
18                     try {
19                         //抢占对象监视器
20                         lock.lock();
21                         Thread.sleep(1000L);
22                         System.out.println(Thread.currentThread().getName()+" 我执行完了!");
23                         signalOne.signal();
24                         signalTwo.await();
25                     } catch (InterruptedException e) {
26                         e.printStackTrace();
27                     }finally {
28                         lock.unlock();
29                     }
30                 }
31             }
32             
33         };
34         thread.start();
35         while(true) {
36             try {
37                 lock.lock();
38                 Thread.sleep(1000L);
39                 System.out.println(Thread.currentThread().getName()+" 我执行完了!");
40                 signalTwo.signal();
41                 signalOne.await();
42             } catch (InterruptedException e) {
43                 e.printStackTrace();
44             }finally {
45                 lock.unlock();
46             }
47         }
48     }
49 }

方案三

 1 package com.xiyao.opensource.java.util.concurrent;
 2 
 3 import java.util.concurrent.SynchronousQueue;
 4 
 5 public class BlockingQueueT {
 6 
 7     /**
 8      * 1、这里至少将一种思想,该实现是不严谨的,因为没有两者之间没有监视器
 9      * 2、监视器只允许同一时间一个执行
10      * 3、该例子因为try中不是一个完整的方法,所以可能存在一个放入了对象还没打印,对方已经抢先又执行了一次
11      * @param args
12      */
13     public static void main(String[] args) {
14         /**
15          * LinkedBlockingQueue
16          * ArrayBlockingQueue
17          * PriortyBlockingQueue
18          * SynchronousQueue
19          */
20         SynchronousQueue queue = new SynchronousQueue();
21         Thread thread = new Thread() {
22             @Override
23             public void run() {
24                 while(true) {
25                     try {
26                         Thread.sleep(1000L);
27                         queue.put(new Object());
28                         System.out.println(Thread.currentThread().getName()+" 我执行完了!");
29                     } catch (InterruptedException e) {
30                         e.printStackTrace();
31                     }
32                 }
33             }
34             
35         };
36         thread.start();
37         while(true) {
38             try {
39                 Thread.sleep(1000L);
40                 queue.take();
41                 System.out.println(Thread.currentThread().getName()+" 我执行完了!");
42             } catch (InterruptedException e) {
43                 e.printStackTrace();
44             }
45         }
46     }
47 }

 

以上是关于java面试题(下)的主要内容,如果未能解决你的问题,请参考以下文章

经验总结:Java高级工程师面试题-字节跳动,成功跳槽阿里!

前端面试题之手写promise

一道经典面试题:字符串在Java中如何通过“引用”传递

Java之String相关内容详解(字符串和字符串常量池)面试题

面试题求解:用java列举某个文件夹下所有的文件或者目录编程题

Java面试题总结