线程安全的类
- StringBuffer
①线程安全,可变的字符序列
②从版本JDK5开始,被StringBuilder替代。通常应该使用StringBuilder类,因为它支持所有相同的操作,但他更快,因为它不执行同步
- Vector
①从Java2平台V1.2开始,该类改进了List接口,使其成为Java CollectionFrameWork的成员。与新的集合实现不同,Vector被同步。如果不需要线程安全的实现,建议使用arrayList代替Vector
- Hashtable
①该类实现了一个哈希表,他将键映射到值,任何非null对象都可以用作键或者值
②从Java2平台V1.2开始,该类进行了改进,使其成为Java CollectionFrameWork的成员。与新的集合实现不同,Hashtable被同步,如果不需要线程安全的实现,建议使用HashMap代替Hashtable
Collections中的静态方法将线程不安全的集合转换为线程安全的
静态方法 |
说明 |
synchronizedCollection(Collection<T> c) |
返回由指定集合支持的同步(线程安全)集合 |
synchronizedList<T> list |
返回由指定列表支持的同步(线程安全)列表 |
synchronizedMap(Map<k,v> m) |
返回由指定mao支持的同步(线程安全)映射 |
synchronizedSet(Set<T> s) |
返回由指定集合支持的同步(线程安全)集。 |
synchronizedSortedMap(SortedMap<K,V> m) |
返回由指定的排序映射支持的同步(线程安全)排序映射。 |
synchronizedSortedSet(SortedSet<T> s) |
返回由指定的排序集支持的同步(线程安全)排序集。 |
Lock锁
Lock实现提供比使用synchronized方法和语句可以获得更广泛的锁定操作
- lock中提供了获得锁和释放锁的方法
①void lock():获得锁
②void unlock():释放锁
- lock是接口不能直接实例化,这里采用它的实现类ReentrantLock来实例化
构造方法 |
说明 |
ReentrantLock() |
创建一个ReentrantLock的实例 |
public class SellTicket implements Runnable {
private int ticketCount = 100;
private Lock lock = new ReentrantLock();
@Override
public void run() {
while (true) {
lock.lock();
try {
if (ticketCount > 0) {
System.out.println(Thread.currentThread().getName() + "正在出售第" + ticketCount + "张电影票");
try {
Thread.currentThread().sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
ticketCount--;
}
} finally {
lock.unlock();
}
}
}
}
网友评论