美文网首页java复习
2020-07-09线程安全的类

2020-07-09线程安全的类

作者: 智障猿 | 来源:发表于2020-07-09 18:03 被阅读0次

线程安全的类

  • 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();
            }
        }
    }
}

相关文章

网友评论

    本文标题:2020-07-09线程安全的类

    本文链接:https://www.haomeiwen.com/subject/bdyscktx.html