多线程(三)

来源:互联网 发布:欧式快热炉 油汀 知乎 编辑:程序博客网 时间:2024/06/05 03:32
38) 如何在Java中创建Immutable对象?
要创建不可变类,要实现下面几个步骤:
(1)、通过构造方法初始化所有成员;
(2)、对变量不要提供set方法;
(3)、将所有的成员声明为私有的,这样就不允许直接访问这些成员;
(4)、在get方法中,不要直接返回对象本身,而是克隆对象,并返回对象的拷贝。


39) Java中的ReadWriteLock是什么?
一般而言,读写锁是用来提升并发程序性能的锁分离技术的成果。
Java中的ReadWriteLock是Java 5 中新增的一个接口,一个ReadWriteLock维护一对关联的锁,一个用于只读操作一个用于写。
在没有写线程的情况下一个读锁可能会同时被多个读线程持有。
写锁是独占的,你可以使用JDK中的ReentrantReadWriteLock来实现这个规则,它最多支持65535个写锁和65535个读锁。


40) 多线程中的忙循环是什么?
忙循环就是程序员用循环让一个线程等待,不像传统方法wait(), sleep() 或 yield() 它们都放弃了CPU控制,而忙循环不会放弃CPU,
它就是在运行一个空循环。这么做的目的是为了保留CPU缓存,在多核系统中,一个等待线程醒来的时候可能会在另一个内核运行,
这样会重建缓存。为了避免重建缓存和减少等待重建的时间就可以使用它了。你可以查看这篇文章获得更多信息。


41)volatile 变量和 atomic 变量有什么不同?
volatile变量和atomic变量看起来很像,但功能却不一样。
Volatile变量可以确保先行关系,即写操作会发生在后续的读操作之前, 但它并不能保证原子性。
例如用volatile修饰count变量那么 count++ 操作就不是原子性的。
而AtomicInteger类提供的atomic方法可以让这种操作具有原子性如getAndIncrement()方法会原子性的进行增量操作把当前值加一,
其它数据类型和引用变量也可以进行相似操作。


42) 如果同步块内的线程抛出异常会发生什么?
若你能想到锁是否释放这条线索来回答还有点希望答对。无论你的同步块是正常还是异常退出的,里面的线程都会释放锁,
所以对比锁接口我更喜欢同步块,因为它不用我花费精力去释放锁。


44) 如何在Java中创建线程安全的Singleton?
请参考我的博客中设计模式中的章节。采用双检锁来创建线程安全的单例模式


45) 如何强制启动一个线程?
目前还没有方法强制启动一个线程,虽然你可以使用System.gc()来进行垃圾回收,但是不保证能成功。
在Java里面没有办法强制启动一个线程,它是被线程调度器控制着且Java没有公布相关的API


46) Sleep()与wait()的区别
(1)、sleep()属于Thread类;wait()属于Object类 
(2)、sleep()使一个线程处于休眠状态,线程不会释放对象占用的锁;
 wait()使一个线程处于等待状态,线程会释放对象占用的锁。
(3)、sleep()可以在任何地方使用;
 wait()/notify()/notifyall()只能在synchronized同步的方法或代码块中使用。


47) Java中的fork join框架是什么?
fork join框架是JDK7中出现的一款高效的工具,Java开发人员可以通过它充分利用现代服务器上的多处理器。
它是专门为了那些可以递归划分成许多子模块设计的,目的是将所有可用的处理能力用来提升程序的性能。
fork join框架一个巨大的优势是它使用了工作窃取算法,可以完成更多任务的工作线程可以从其它线程中窃取任务来执行。


48) Java中同步有哪些?
(1)、synchonized:synchonized同步的代码块或者方法是由jvm虚拟机自动释放的,因此在线程中抛出异常会自动释放锁
(2)、volatile:volatile就是告诉vm从内存中读取变量/对象的值
多线程中,volatile关键字修饰的变量,保证了其在多线程之间的可见性。
(3)、lock:lock()的释放unlock()需要在finally修饰的代码块中手动释放,防止运行过程中抛出异常,导致死锁。


49) HashMap,Hashtable,ConcurrentHashMap的原理和区别
(1)、HashMap是线程不安全的
(2)、Hashtable是线程安全的,但是效率低;使用synchronized同步方法的。
(3)、ConcurrentHashMap:线程安全而且效率高,因为它包含一个segment数组,将数据分段存储,给每一段数据配一把锁,也就是所谓的锁分段技术。
1 0
原创粉丝点击