java并发面试题(二)

  1. 什么是线程安全?
    答:当多个线程访问同一个对象时,不会产生不确定的结果,就做到线程安全了。

  2. 哪些集合类是线程安全的?
    答:Vector,Hashtable,ConcurrentHashMap,Stack。

  3. 进程间如何通讯?
    答:
    管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系。
    有名管道 (namedpipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
    信号量(semophore ) :信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。
    消息队列(message queue):消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。
    信号 (sinal):信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生。
    共享内存(shared memory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。
    套接字(socket):套接字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。

  4. 线程间如何通讯?
    答:
    锁机制:这里包括互斥锁、条件变量、读写锁
    信号量机制:这里包括无名线程信号量和命名线程信号量
    信号机制:类似进程间的信号处理线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制

  5. 多线程中的忙循环是什么?
    答:忙循环其实就是让线程循环一个空循环,它不会像sleep(),wait()等方法一样会让出CPU资源。因为在多核系统中,一个线程被唤醒后可能会在另一个内核里运行,这样就需要重建CPU缓存,而使用忙循环可以避免缓存重建和减少等待重建的时间。

  6. 如何确保线程安全?
    答:使用原子类,volatile关键字,不变类和线程安全类,还有实现并发锁。

  7. 什么是竞争条件?
    答:当多个线程同步操作一个对象,连作为开发者的我们都不能预测它最终的状态是什么,这就代表出现竞争条件了。

  8. 如何解决竞争条件?
    答:加锁,使用synchronized关键字或者Lock类。

  9. 如何停止一个正在运行的线程?
    答: 可以使用共享变量的方式,这个变量对多个线程都是可见的,所以可以用来作为线程的中断信号。还可以使用interrupt()方法终止线程运行,相比起stop()方法,这种方法更显优雅和安全。

  10. 线程的stop方法和interrupt方法有什么区别?
    答:可参考本篇博客【线程的stop方法和interrupt方法

发布了200 篇原创文章 · 获赞 201 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/weixin_38106322/article/details/104461637
今日推荐