--Start--原子操作 --
【不会被线程调度机制打断的最小执行单元】

--End-- 原子操作 --

--Start--  线程安全包装器  --
【1.对于类中方法实现线程非同步(非线程安全)和同步(线程安全)两种访问机制,避开因单线程造成死锁的性能问题。】
//AccountWrapper类  对  Account 类 的线程安全封装
public class AccountWrapper
{
private Account _a;
///非线程安全
public AccountWrapper()
{
this._a=new Account();
}

///线程安全
public AccountWrapper(Account a)
{
this._a=a;
}
public bool Withdraw(double dnum)
{
lock(_a)
{
return this._a.Withdraw(dnum);
}
}
}
【2.内置同步包装器eg:System.Collections里的ArrayList、Hashtable】
Hashtable h= Hashtable.Synchronized(new Hashtable());
--End--线程安全包装器--
--Start--NET同步支持--
1.Monitor    //用于同步代码区
2.Mutex     //进程同步&代码区同步
3.AutoResetEvent,ManualResetEvent  
4.Interlocked   //同步访问一个由多线程共享的变量
Interlocked.Inerement(ref i)
5.SynchronizationAttribute
6.MethodImplattribute      //用于 同步代码块
[MethodImpl(MethodImplOptions.Synchronized)]
public void DoSomeWorkSync()
{
}
7.ReaderWriterLock
AcquireReaderLock()
AcquireWriterLock()
ReleaseReaderLock()
ReleaseWriterLock()
8.lock
9.ThreadStaticAttribute 类
【用于静态变量上为每个执行线程创建一个单独变量(非共享变量)】
class ThreadStatic
{
[System.ThreadStaticAttribute()]
public static int x=1;    // 有 线程静态变量属性
public static int y=1;    // 无 线程静态变量属性
public void Run()
{}
}
public class MainApp
{
public static void Main()
{
ThreadStatic tS=new ThreadStatic();
Thread tX=new Thread(new ThreadStart(tX.Run));
Thread tY=new Thread(new ThreadStart(tY.Run));
tX.Start();
tY.Start();
}
}
--End--  NET同步支持  --
--Start--  同步VS性能  --
【线程同步需要获得同步锁(消耗系统时间),性能弱于非线程安全】
--End-- 同步VS性能 --
--Start--死锁--
【严防死锁方法之一:避免一次取得多个锁】
--End--  死锁 --
--Start--  数据库连接池  --
数据据库连接池应用程序UML描述图
【1.实现池】
ObjectPool类
collectGarbage() 用于处理池中对象回收
GARBAGE_COLLECT常量设置垃圾收集间隔时间(默认为30s)
using System;
using System.Collections;
using System.Timers;
namespace WroxCS
{
public abstract class ObjectPool
{
private long _lastCheckOut;        //last Checkout time of any object from the pool
private static Hashtable locked;        //Hashtable of the checked-out objects
private static Hashtable unlocked;        //Hashtable of avaltable objects
internal static long GARBAGE_INTERVAL=90*1000;        //Clean-Up interval (set 90s)
static ObjectPool()
{
locked=Hashtable.Synchronized(new Hashtable());
unlocked=Hashtable.Synchronized(new Hashtable());
}
internal ObjectPool()
{
_lastCheckOut=DateTime.Now.Ticks;
System.Timers.Timer aTimer=new System.Timers.Timer();        //Create a Time to track the expired objects for cleanup
aTimer.Enabled=true;
aTimer.Interval=GARBAGE_IMTERVAL;
aTimer.Elapeed+=new System.Timers.ElapsedEventHandler(CollectGarbage);
}
protected abstract object Create();
protected abstract bool Validate(object o);
protected abstract void Expire(object o);
internal object GetObjectFromPool()
{
long now = DateTime.Now.Ticks;
_lastCheckOut=now;
object o=null;
lock(this)
{
try
{
foreach(DictionaryEntry myEntry in unlocked)
{
o=myEntry.Key;
if(validate(o))
{
unlocked.Remove(o);
locked.Add(o,now);
return(o);         
}
else
{
unlocked.Remove(o);
expire(o);
o=null;
}
}
}
catch(exception){}
o= Create();
locked.Add(o,now);
}    
return (o);    
}
internal void ReturnObjectToPool(object o)
{
if(o!=null)
{
lock(this)
{
locked.Remove(o);
unlocked.Add(o,DateTime.Now.Ticks);
}
}
}
private void CollectGarbage(object sender,System.Timers.ElapsedEventArgs ea)
{
lock(this)
{
object o;
long now=DateTime.Now.Ticks;
IDictionaryEnumerator e=unlocked.GetEnumerator();
try
{
while(e.MoveNext())
{
o=e.Key;
if(now-((long)unlocked[o])>GARBAGE_INTERVAL)
{
unlocked.Remove(o);
Expire(o);
o=null;
}
}
}
catch(Exception){}
}
}
}
}
DBConnectionSingleton类 ,数据库链接对象池的实现方式
--End--  数据库连接池  --
--Start--    线程设计规   --
STA线程单元
【运行方式:Object-Per-Client,对所有线程的调用都放到一个队列,逐个出队处理。】
C#
[STA ThreadAttribute]
static void Main()
{
}
ASP.NET  
【默认为多线程(MTA模式),加如下代码至页面顶部将在STA线程模式下运行,会降低应用程序的性能。】
<%@Page AspCompat="true"%>
线程设计模式
a.主线程和工作线程模式
b.对等线程模式
c.管道线程模式
--End--  线程设计规划  --
--Start-- CLR   --
【公共语言运行时,Common Language Runtime)和Java虚拟机一样也是一个运行时环境(用于创建托管代码环境),它负责资源管理(内存分配和垃圾收集),并保证应用和底层操作系统之间必要的分离。eg:编译、GC、内存管理、、线程池】

--End--   CLR   --
--Start--  线程池  --
【优势】
1.无需为创建线程耗费时间,线程池中线程是现成的(CLR分配),一直处于等待任务分派的装填
2.线程生命期结束.net会回收其资源
3.线程池根据系统当前的进程,优化线程时间片
4.线程池允许启动多个线程,而不必为每个线程设置属性
5.线程池允许将状态信息作为一个对象传递给当前执行任务的过程参数
6.线程池可以将处理客户请求的线程数量固定为某一个最大值( 默认情况下,每个进程可以产生25个线程池线程,这个数量可以通过编辑mscoree.h文件中的CorSetMaxThreads成员加以改变)
【劣势】
1.任务一旦加入队列,不能人为启动、挂起、终止
2.线程池不适用于又大又长的任务
3.线程池的成本效率比很高,需小心使用池中的线程,线程池的大小应该固定不变
4.线程池中的所有线程都处于多线程单元中(MTA)
5.不能为线程池中的任务设置优先级
6.对任意应用程序域,只能有一个线程池与其关联
7.如果线程池中的一个线程任务被锁定,这个线程将不会呗释放回池中。
【ThreadPool类】
1.BindHandle     //该方法将操作系统句柄绑定到线程池中
2.GetAvailableThreads    //该方法指出(在达到最大限制值之前)可以添加到任务项队列中的任务数(添加到线程池中的请求数)
public static void GetAvailableThreads(out int workerThreads,out int completionPortthreads)
workerThreads表示线程池中工作线程的数量
completionPortThreads表示异步的 I/O 线程数量
3.GetMaxThreads        //该方法指出线程池可以同时排队的请求数量(反回线程池可以处理的并发请求的最大数量)
public static void GetMaxThreads(out int workerThreads,out int completionPortThreads)
WorkerThreads表示线程池中工作线程的数量
CompletionPortThreads表示异步 I/O 线程的数量
4.QueueUserWorkItem        //该方法将一个任务项排列到线程池中
public static bool QueueUserWorkItem(WaitCallback callBack)
callBack表示线程池中的线程获得任务项时要调用的委托,返回值true表明方法调用成功
public static bool QueueUserWorkItem(WaitCallback callBack , object state)
callBack表示线程池中的线程获得任务项时要调用的委托,返回值true表明方法调用成功,state表示包含状态的对象,该对象将在线程执行任务时传递给委托
5.RegisterWaitForSingleObject        //该方法注册一个委托,他等待一个WaitHandle
6.UnsafeQueueUserWorkItem        //这是QueueUserWorkItem()方法的非安全版本
7.UnsafeRegisterWaitForSingleObject        //这是RegisterWaitForSingleObject()方法的非安全版本
【Demo  一】
class Program
{
static void Main(string[] args)
{
int m_work_threads;//工作线程数
int m_io_threads;//IO线程数
bool Succ1 = ThreadPool.SetMaxThreads(5, 5);//设置线程池最多自由的线程数,我这里测试必须≥4才能成功(返回true)
ThreadPool.GetMaxThreads(out m_work_threads, out m_io_threads);//获取经过设置之后的最大线程数,顺便查看是否成功
Console.WriteLine("当前最大工作线程数:{0},I/O线程数: {1}-{2}", m_io_threads, m_io_threads, Succ1);
for (int i = 0; i < 10; i++)
{
//线程池管理线程列表
ThreadPool.QueueUserWorkItem(JobForAThread);
}
Thread.Sleep(30);
ThreadPool.GetAvailableThreads(out m_io_threads, out m_io_threads);//获取还剩可用的最大工作,IO线程数目
Console.WriteLine("剩余工作线程数:{0},I/O线程数: {1}", m_io_threads, m_io_threads);
Console.ReadKey();
}
static void JobForAThread(object state)
{
for (int i = 0; i < 1; i++)
{
Console.WriteLine("loop {0},running inside pooled thread {1}", i, Thread.CurrentThread.ManagedThreadId);// 池线程中运行
List<int> list = new List<int>();
list.AddRange(new int[] { 10, 6, 11, 12, 13, 14 });
if (list.Contains<int>(Thread.CurrentThread.ManagedThreadId))
{
Thread.Sleep(4000);
}
Thread.Sleep(50);
}
}
}
【Demo 二】
--End--  线程池   --
--Start--    MSMQ   --
【Message Queue(微软消息队列)是在多个不同的应用之间实现相互通信的一种异步传输模式,相互通信的应用可以分布于同一台机器上,也可以分布于相连的网络空间中的任一位置。】
--End--   MSMQ   --
--Start--  调试跟踪线程   --
Trace  Debug BooleanSwitch TraceSwitch
--End--  调试跟踪线程   --

线程使用手册(Thread reference manual)笔记相关推荐

  1. C++11学习笔记-----线程库std::thread

    在以前,要想在C++程序中使用线程,需要调用操作系统提供的线程库,比如linux下的<pthread.h>.但毕竟是底层的C函数库,没有什么抽象封装可言,仅仅透露着一种简单,暴力美 C++ ...

  2. 线程(Thread)的学习笔记

    本文是对b站狂神说java多线程的学习总结,附上b站链接https://www.bilibili.com/video/BV1V4411p7EF?spm_id_from=333.999.0.0& ...

  3. Book: Programming with Libevent(2)--A Libevent Reference Manual(1)

    A Libevent Reference Manual 参考链接 R0: Preliminaries Libevent from 10,000 feet The Libraries The Heade ...

  4. java中线程总结_java中多线程学习笔记总结

    线程的简单学习笔记: 1.进程与线程的概念 进程:从用户角度看进程是应用程序的一个执行过程. 从操作系统核心角度看进程代表的是操作系统分配的内存和CPU时间片等资源的基本单位,是为正在运行的程序提供的 ...

  5. java线程集合点_Java多线程学习笔记(三) 甚欢篇

    使人有乍交之欢,不若使其无久处之厌 <小窗幽记>很多时候,我们需要的都不是再多一个线程,我们需要的线程是许多个,我们需要让他们配合.同时我们还有一个愿望就是复用线程,就是将线程当做一个工人 ...

  6. java 继承thread_java线程-创建线程(继承 Thread 类)

    1.创建线程的方式 线程创建方式是:继承 Thread 类,重写 run 方法.如下:public class Task extends Thread{ @Override public void r ...

  7. java线程学习-Thread.currentTread().getName()和this.getName()的区别

    很久没有写java程序了,由于为了改变目前的状况,打算花两天时间学习一下java的线程开发和高并发. 线程开发使用thread类,或者runnable接口,而且thread类也是实现了runnable ...

  8. linux 线程操作问题undefined reference to ‘pthread_create‘的解决办法(cmake)

    linux 线程操作问题undefined reference to 'pthread_create'的解决办法(cmake) 参考文章: (1)linux 线程操作问题undefined refer ...

  9. java-多线程操作全(Thread)-Timer简单使用

    一. 多线程概念和作用 线程指进程中的一个执行场景,也就是执行流程,那么进程和线程的区别是什么 1.每个进程是一个应用程序,都有独立的内存空间 2.同一个进程中的线程共享其进程中的内存和资源 (共享的 ...

最新文章

  1. 张一鸣:10年面试2000人,我发现混得好的人,全都有同一个特质
  2. ICRA 2021 | UPSLAM:联合全景SLAM
  3. hexo博客系统安装
  4. 电脑工具栏怎么调整到下面_雷电模拟器4.0怎么玩召唤与合成 一键下载轻松游玩 - 工具软件...
  5. 软件测试——0422作业
  6. sqlyog如何设置.时提示字段名_Spring boot 中使用 Tomcat时 用户名 密码如何设置呢?...
  7. reduce 阶段遍历对象添加到ArrayList中的问题
  8. MySQL-30道面试题
  9. 计算已知经纬度两点的距离_python
  10. 项目管理术语中英文对照
  11. 《管理的实践》读书心得摘录
  12. Apple和Ruby近况:Rails的iPhone配置实用工具和Ruby的SproutCore工具
  13. 华为平板与非华为电脑(Windows系统)连接
  14. 模拟信道与数字信道的区别
  15. GZOI2019GXOI2019 滚粗记
  16. 一个微信小程序开发示例
  17. JavaScript语法 ES6、ES7、ES8、ES9、ES10、ES11、ES12新特性汇总
  18. TabLayout+ViewPager2联动
  19. 考研高数 专题5:泰勒公式及其应用(皮亚诺型余项/局部)(拉格朗日余项/整体)
  20. 蓝牙协议分析(5)_BLE广播通信相关的技术分析

热门文章

  1. 我司为了避免我下班高峰挤公交
  2. 这几个实用的电脑技巧分享给需要的你
  3. ExternalInterface.addCallBack 在TT浏览器 IETester等浏览器上的问题
  4. ExternalInterface类的使用
  5. Shopee、ebay、亚马逊等跨境卖家了解测评的一篇干货
  6. 顶尖投资机构护航,MECHANIC实现腾飞发展!
  7. 后人类社会形态“元宇宙”来临,MECHANIC打造元宇宙游戏平台
  8. 【常用代码总结】常用的各种配置文件生成,realsense使用以及姿态估计所需
  9. matlab 从 tushare 股票、期货、期权市场及财务数据
  10. WinServer 2016 自带MPIO实现高可用性的iSCSI存储实践