【Java进阶】多线程编程(二)
1. Java中的内置多线程操作
Java中为了线程安全,有一些集合和方法在底层就实现了多线程,接下来对这些集合和方法的运用进行研究探讨。
首先是非线程安全的Collection接口,对于实现该接口的所有集合,如List, Set, Queue,这些集合都是单线程集合,是非线程安全的,在多个线程同时调用时不能保证正确性,如果要让其变为线程安全,需要使用Collections.sychronized方法,比如:

而只有早期的Vector, Hashtable 是线程安全的,它给所有的public方法加上了synchronize关键字,但是由于其效率较低而被弃用。
此外关于字符串,也有StringBuilder和StringBuffer这一对,前者是非线程安全的,后者通过synchronize关键字,实现了线程安全。当然,由于实现线程安全后的低效操作,在单线程操作时往往用StringBuilder提高效率。
2. 死锁的形成
首先,明确锁的概念,通过synchronize关键字,将部分进程加锁,以阻止其他线程的访问。死锁的出现来源于,两个或多个线程出现互相等待对方的锁释放的情况,比如下面的例子:

有两个线程thread1和thread2,线程1对w1加锁,并等待w2的释放,线程2对w2加锁,并等待w1的释放,两个线程同步进行,结果互相等待,形成死锁。
解决该死锁的办法有,一是避免形成互相等待的情形,设置最大等待时间,超过这个时间直接释放;二是让两个线程异步启动,从而直接避免死锁。

浙公网安备 33010602011771号