`
y806839048
  • 浏览: 1106734 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

线程安全之对象组与对象池

阅读更多

线程池有两个地方可以保证线程安全,1,单线程---一次只能一个线程进入2,线程池中的队列用阻塞队列

。线程池对象多个线程争夺,以这个对象为锁,即实现

 

对象池:单线程池中的队列中对象,一次只能被一个线程访问

 

对象组:一个数组装许多单线程池对象,这样数组中的对象本身是线程安全,用时从其队列中获取业务对象(队列中的业务对象不是线程安全的),可以理解为对象组就是多个对象池放入数组

数组就是为了多线程并发,数组中的单线程池对象就是处理多线程并发中同时操作一个对象的问题(放到任务队列等待)---nioeventloop

 workers=数组

worker=单线程池对象=nioeventloop,

nioeventloop=selectors+taskqueue

 用channel为锁,防止不同线程(客户端,另一个客户端同时操作一个管道)

 一个selector一个chanel(selecrors是另起的收集一个管道中所有的该管道注册事件)

 

 boss和worker都是nioEventLoop:

 

 boss---专门用来接收连接建立channels分配给业务处理器worker(hash取模轮回注册给worker中的selector(全局变量)----分配在worker中注册

 

workers---对象组

    

      work---单线程池对象---eventLoop(一次一个线程访问)  不断的执行selector监听

             selectors(全局变量) + taskqueue

         selector监听获取所有channels中可用的 一个channel处理

 

channel ---所有wokers公用的(worker服务的对象不会固定于某一个channel,哪个向其注册的channel中哪个空闲就用那个)(同步块控制线程安全--channel为门栓)

      nio连接的特性: 一个客户端永远是这一个线程(除非关闭连接)+channel门栓---实现只允许一个时刻一个客户端连接操作同一个channel

      channel中当前执行的线程中的channel对象和新的任务线程的channel是同一个对象就新的线程不执行放入任务队列,新的线程

      进来绑定同一个channel就是另一个客户端(对话的另一端)也企图操作这个channel,这种情况拒绝),同一个线程新的指令没有直接执行不必放入循环队列后续执行(最终都会执行)--这种就实现了一个时刻只允许一个客户端连接操作一个channel(一般的通信是一个channel有两个交谈者操作,一个在操作另一个需要等---一个客户端一个线程)

 

上面是解决io类的冲突,同时通过先把任务执行完,之后检查chanhel的状态,有准备好的channel就io,避免并发冲突(避免io和非io的冲突(渠道的注册之类))

 

selectors---全局变量

 

 

 



 

 

 对应上图的概括:

 

 

 

 

  • 大小: 175.8 KB
  • 大小: 41.9 KB
分享到:
评论

相关推荐

    高效的,固定大小的对象池

    4. 锁定与同步:在多线程环境下,需要确保对象池的操作是线程安全的。 5. 溢出处理:当对象需求超过池的容量时,需要有合适的策略来处理,如拒绝服务、动态扩展(不适用于固定大小池)或回退到常规的内存分配。 综...

    c++ 面向对象多线程编程

    在C++编程中,面向对象和多线程是两个重要的概念,它们对于开发高效、并发的软件至关重要。本文将深入探讨这两个主题,并结合C++语言特性...在实际项目中,要始终考虑线程安全、性能优化以及代码的可读性和可维护性。

    Java对象池实现源码

    在Java编程中,对象池是一种优化资源管理的技术,它的核心思想是预先创建并维护一组对象,供程序在需要时重复使用,而不是每次需要时都创建新的对象。这有助于减少对象的创建和销毁带来的开销,特别是在频繁创建和...

    cpp-ump一个通用的线程安全内存池

    《C++ UMP:一个通用的线程安全内存池》 在C++编程中,内存管理是至关重要的一环。为了提高程序性能并优化资源利用,内存池技术应运而生。本文将深入探讨UMP(通用线程安全内存池)的概念、实现原理以及它在C++中的...

    万能对象池【C#实现】

    对象池通过预先创建并维护一组对象,避免了每次需要对象时都进行新的实例化操作。当应用程序请求对象时,对象池会从已创建的对象中分配,而不是调用`new`关键字。当对象不再需要时,它们不会被立即销毁,而是返回到...

    内存池对象池设计

    4. **线程安全(Thread Safety)**:在多线程环境中,内存池和对象池需要确保并发访问的安全性,可能需要使用锁或其他同步机制。 5. **性能优化(Performance Optimization)**:为了最大化效率,可能需要对内存...

    C#的对象池课件

    C#的对象池设计模式是基于资源复用的理念,它通过预先创建一组对象并存储在一个“池”中,当需要对象时,可以从池中获取而不是每次创建新的实例。这尤其适用于生命周期短、创建成本高的对象,如数据库连接、线程或...

    轻量级的对象池

    - **线程安全**:为了确保多线程环境下的正确操作,对象池需要实现线程安全的获取和释放对象的机制,通常通过锁来实现。 - **对象生命周期管理**:需要有策略来决定何时创建新对象,何时回收对象。例如,当空闲...

    对象池管理器(项目中中剥离出的)

    7. **线程安全**:在多线程环境中,对象池管理器必须保证线程安全,确保并发访问时的数据一致性。 8. **监控与调试**:为了便于性能调优和问题排查,对象池管理器通常会提供一些监控和日志记录功能,如对象使用统计...

    多线程ADO安全访问SQL

    **线程安全策略** 1. **连接池**:创建一个连接池,由所有线程共享。每次需要执行操作时,线程从池中获取一个连接,完成后再归还。这种方式减少了连接的创建和销毁开销,但需要谨慎管理连接的生命周期,防止资源...

    windows多线程总结

    理解并熟练运用这些Windows多线程编程的知识,能够帮助开发者构建高效、可靠的多线程应用,同时注意线程安全和资源管理,避免潜在的问题。在实际开发中,还需要结合具体的编程语言和库(如C++的Windows API或C#的...

    .NET Framework4 线程安全集合详解

    .NET Framework 4 提供了一组线程安全的集合类,这些类位于 `System.Collections.Concurrent` 命名空间中,旨在提高多线程环境下的性能和安全性。这些集合类允许开发者在无需额外同步代码的情况下安全地进行并发读写...

    windows环境下的多线程编程原理与应用

    线程池是一种管理线程的机制,它预先创建一组线程,当有任务需要执行时,从池中获取空闲线程,而非每次都创建新线程。这减少了线程创建和销毁的开销,提高了效率。 七、线程通信 线程间通信(IPC)允许线程间交换...

    Apache common pool2 对象池

    Apache Commons Pool2 是一个强大的对象池库,广泛用于管理和复用昂贵资源,如数据库连接、线程、对象实例等。对象池的概念是基于池化思想,通过预先创建并维护一组对象,来避免频繁的创建和销毁操作,从而提高性能...

    多线程一些经验

    例如,线程安全是多线程编程必须面对的问题,程序员需要确保对共享数据的操作是原子性的,或者使用适当的同步机制来避免数据不一致。此外,死锁是多线程环境下常见的问题,当两个或更多的线程相互等待对方释放资源,...

    CSharp多线程基础教程

    本教程将深入探讨C#中的多线程基础,包括创建线程、线程同步与通信、线程池以及线程安全等内容。 一、线程创建 在C#中,有两种主要方式来创建线程:使用`System.Threading.Thread`类和使用`System.Threading.Tasks...

    基于Spring+Ibatis的安全线程实现

    4. 注意数据库连接池的配置,例如Druid或HikariCP,它们能有效管理数据库连接,确保线程安全。 至于“FirstIbatis_no_service”这个文件名,可能是示例代码的一部分,暗示着该例子可能是一个未包含服务层(Service ...

    第五讲-Java对象运行机制与多线程2019-V31

    每个`BankAccount`对象的创建和方法调用都是在不同的栈帧上进行的,确保了线程安全。 在JVM中,方法调用通过操作数栈进行参数传递,例如`b.deposit(100)`会将`b`对象引用和`100`推入操作数栈,然后调用`deposit`...

    C++实现线程管理池memorymanager

    - **线程安全的容器**:如std::atomic和std::lock_guard,保证在多线程环境下的正确性。 - **线程局部存储**:std::thread_local关键字,为每个线程提供独立的存储区域。 5. **任务队列**: - **任务的封装**:...

    鱼刺多线程模块

    模块中的功能可能包括线程的创建、同步、通信以及线程安全的数据访问等。 在"鱼刺多线程模块"中,开发者可以创建新的线程来执行特定任务,比如处理用户输入、计算复杂算法或是进行IO操作。线程间同步机制,如锁、...

Global site tag (gtag.js) - Google Analytics