`
wx1568905209
  • 浏览: 25164 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

线程(五)

 
阅读更多

一、同步类容器

1、传统的同步类容器Vector,HashTable,为什么是安全型的,是因为在内部功能都是采用JDK的Collections.synchronizedXXX()实现,底层机制就是传统的关键字synchronized对每个方法实现同步。

public synchronized boolean add(E e) {
    modCount++;
    ensureCapacityHelper(elementCount + 1);
    elementData[elementCount++] = e;
    return true;
}

可以看到这这些增删的方法都加了synchronized,每次只能有一个线程访问,第二个线程只能等待,不支持并发。 保证了安全,但性能不好。

二、并发类容器

1、ConcurrentMap是个接口,实现的主要有:ConcurrentHashMap,ConcurrentSkipListMap

concurrentHashMap引入segment,更细粒度减少锁的范围,从而提高并发,一个map最多分为16段

每个段其实是一个HashTable

2、CopyOnWriteXXX

CopyonWriteArryList:对写操作通过ReentLock进行加锁,读操作并无加锁; 场景:读多写少

原理:集合[1,2,3],如果有线程写元素会拷贝一份,然后再拷贝的副本上进行添加,写之后,对象指向新的数组引用,而不影响读,但是这种性能不好,频繁的写会拷贝数组,同时旧数组又会被回收,导致性能不好

public boolean add(E e) {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        Object[] elements = getArray();
        int len = elements.length;
        Object[] newElements = Arrays.copyOf(elements, len + 1);
        newElements[len] = e;
        setArray(newElements);
        return true;
    } finally {
        lock.unlock();
    }
}

我们可以看到都是有锁,保证写的时候安全性

 

CopyonWriteArraySet

 

 

 

 

转载于:https://my.oschina.net/u/2504766/blog/758700

分享到:
评论

相关推荐

    28线程五大状态1

    【标题】:“28线程五大状态1” 【描述】:描述中提到的内容与线程状态和 Redis 相关,但未直接提及 Redis 的线程模型。线程的状态包括新生、就绪、阻塞、运行和消亡,这些是操作系统中线程的基本生命周期阶段。 ...

    计算机网络实验期末作业-15小时JavaSocket多线程五围棋简易模拟器.zip

    计算机网络实验期末作业-15小时JavaSocket多线程五围棋简易模拟器

    IBM多线程编程基础教程

    5. **同步详细信息**(IBM多线程五-同步详细信息.doc): - `wait()`, `notify()`, `notifyAll()`方法:在同步块或同步方法中使用,用于线程间通信和协作。 - `Lock`接口:比`synchronized`更灵活的锁机制,提供了...

    MFC多线程 工作者线程 用户界面线程

    五、线程安全 在多线程环境中,需要特别注意线程安全问题。当多个线程访问同一资源时,应确保资源的正确访问和更新,防止数据不一致。使用MFC的同步对象(如C CriticalSection)可以确保对共享数据的独占访问。 六...

    浅谈JAVA语言的多线程技术.pdf

    五、多线程技术的应用 多线程技术广泛应用于各种领域,如网络编程、数据库操作、图形界面编程等。使用多线程技术可以提高系统的响应速度、提高系统的性能和可靠性。 六、结论 JAVA语言的多线程机制为编程人员提供...

    MFC多线程的创建,包括工作线程和用户界面线程

    #### 五、线程消息传递 在多线程环境中,线程间通信非常重要。MFC提供了 `PostThreadMessage` 函数来发送线程消息,其原型如下: ```cpp BOOL PostThreadMessage( UINT message, WPARAM wParam, LPARAM lParam ...

    VC多线程例程五及图解文档(工作者线程)

    本资源“VC多线程例程五及图解文档(工作者线程)”深入探讨了如何在Visual C++中创建和管理工作者线程,以实现并发处理。 工作者线程,也称为后台线程,是在应用程序中执行非用户界面任务的线程。它们不直接与用户...

    Java兔子乌龟公鸡赛跑

    在Java编程语言中,"兔子、乌龟和公鸡赛跑"是一个巧妙地用来演示多线程概念的例子。这个例子通常被用作教学工具,帮助开发者理解如何在并发环境中控制和协调不同线程的行为。多线程是现代计算中一个核心的概念,特别...

    ePump是一个基于I,O事件通知、非阻塞通信、多路复用、多线程等机制开发的事件驱动模型的C语言应用开发框架,利用该框架可以很容易地开发出高性能、大并发连接的服务器程序 .zip

    ePump框架工作模型4.1 快服务模型 -- 没有worker线程,只有ePump线程4.2 复合服务模型 -- 少数 ePump 线程,大部分worker 线程五. ePump框架中的文件FD六. ePump框架的回调(Call Back)机制七. ePump框架的调度...

    线程同步的五种方法

    线程同步是多线程编程中的重要概念,用于协调多个并发执行的线程,确保它们在访问共享资源时不会产生竞态条件或数据不一致性。在Windows编程中,提供了多种线程同步机制,包括互斥量、临界区、原子操作、事件以及...

    易语言线程返回数据的方法

    五、源码分析 在提供的压缩包文件“易语言线程返回数据的方法源码”中,应当包含了具体的实现细节。通过阅读源码,你可以了解到实际应用中的具体实现方式,包括线程创建、数据交换以及返回的逻辑。 总结,易语言...

    python 线程的五个状态

    在Python中,线程的状态变化对理解和管理多线程程序至关重要,以下是对Python线程五个状态的详细说明。 1. 线程的新建状态(New) 新建状态是线程对象被创建后尚未启动前的状态。在这个阶段,线程对象已经存在,但...

    Delphi多线程详解_delphi_delphi多线程_多线程_

    五、线程池 线程池是一种优化资源使用的技术,它预先创建一组线程,当有任务需要执行时,从线程池中获取空闲线程而不是每次都创建新线程。Delphi的System.Classes单元提供了TThreadPool类,方便开发者使用线程池进行...

    PB多线程实现

    五、示例代码 这里提供一个简单的PB.NET多线程示例: ```csharp using System.Threading; public class MyThreadClass { public void RunTask() { // 在这里执行你的任务 } } public class Program { static ...

    多线程的运用e语言多线程 e多线程

    五、实际应用 E语言多线程在实际应用中可能涉及以下领域: 1. Web服务器:处理多个客户端请求。 2. 数据库连接池:复用数据库连接,减少建立和关闭连接的时间。 3. 大数据处理:并行处理大量数据,加快计算速度。 4....

    易语言多线程传递多参数

    五、源码分析 提供的压缩包文件“易语言多线程传递多参数源码”包含了实际的代码实现,这将有助于我们理解上述概念。源码中可能会展示如何创建线程、设置线程参数、以及在线程子程序中如何访问和处理这些参数。通过...

    java 线程池源代码

    `ThreadPoolExecutor`是线程池的具体实现,它的构造函数接受五个参数: 1. `corePoolSize`: 核心线程数,即使无任务执行,也会保留这些线程。 2. `maximumPoolSize`: 最大线程数,当任务队列满时,线程池会创建新的...

    java多线程的讲解和实战

    每个线程都有自己的生命周期,包括新建、就绪、运行、阻塞和结束五个状态。 2. **创建线程的方式**: - 继承`Thread`类:创建一个新的类,继承自`Thread`,重写`run()`方法,然后创建该类的实例并调用`start()`...

    C# MVC 线程和并发

    五、线程池中的线程 * 使用ThreadPool类来管理线程池 * 使用QueueUserWorkItem()方法来将工作项添加到线程池 * 使用GetAvailableThreads()方法来获取可用线程数 六、案例:支持并发的异步日志组件 * 使用Logger类...

    C#线程参考手册 线程学习

    五、线程优先级 每个线程都有一个优先级,但操作系统并不保证优先级高的线程一定先执行,而是尽可能给予较高优先级的线程更多执行机会。 六、后台线程与前台线程 1. 前台线程:与进程生命周期绑定,只有所有前台...

Global site tag (gtag.js) - Google Analytics