多线程的那些事

  新手新学,勿喷。。

直接入题。首先要明确一点,线程调度是随机的,抢占式的!而CPU执行是原子性的。线程是CPU调度资源的最基本单位,而进程,是正在运行的程序。也就是说,线程是依赖于进程存在的,你凭空冒出来一个线程是不可能的。

  然后就是多线程了。首先,什么是多线程,百度百科的很多。就我个人理解的,做一件事,为了缩短完成时间而采取的手段,也就是说从一个起点到一个终点一共走了N条路径,用了N种办法,总而言之,就是为了时间快。举个例子,比如说,小学时候的华罗庚数学题,烧水30分钟,洗衣服10分钟,泡茶叶5分钟,吃饭15分钟,要把这些全完成而时间最短,怎么办?OK,答案大家都知道了,烧水的同时做别的事情,总之就是人尽量很少闲着。换到程序里面,一个进程里,先开一个烧水线程,然后再开个洗衣服吃饭泡茶线程,然后,这就是多线程了,缩短时间,提高CPU利用率。

  其实这些线程,只是我们看起来是同时进行的,还是刚刚的例子,烧水的时候去做别的事,这是人来回换的,同样,

CPU也是这么干的。在线程直接来回切换,一个线程只占用一个小小的时间片,然后到时间了就去下一个线程,来回

切换。有的人说了,这样来回切换不会耗时间吗,当然耗,但是,相比于单线程的那种阻塞等待,这个时间就可以忽略

了。而这也正是同步异步处理的实质了,多线程实现异步,其实正是这样,多个任务只是看起来是同时在进行而已。

  OK,那多线程产生的问题,线程安全,怎么说,再举个例子,一张桌子上,多个人吃饭,只有一个汤勺,怎么办,你

用我就没得用,我用他就没得用,然后就可能抢着抢着就打起来了,多线程就是这样。在对sharing resource进行访问处理时,这个A线程里面对变量i++了,然后刚想输出这个i,就被下一个B线程个抢到了CPU,然后对i--了,然后再回到A线程里面,输出的i,没有变化,A就懵逼了。

  怎么解决呢,办法很多。第一个,给这个共享资源加个锁,A线程进去了,锁上,B想再来,进不去,锁上了,没办法,只能等或者去做别的事,然后A干完了事情,释放锁,然后B就可以进去了,这样就可以保证对同一资源的访问安全了。又有人说了,如果A进去了B在等,那这样和单线程同步有什么区别呢,注意了,这里的同步,是为了解决多线程环境下对共享资源的访问问题,最终说起来还是多线程效率更高一点。第二个,比如说你去在刚刚那个只有一个汤勺的桌子上,你更强壮,OK,勺子就是你的,因为别人抢不过你,这就是设置优先级了,给某个线程设置优先级,让它能够先执行处理,同样,你不愿意一个勺子,你可以自己带个勺子进去,这就是所说的复本,对于共享资源,可以给个复本,也就是多个引用,这样,大家可以各用各的,比如说ThreadLocal类,就可以为每个共享的变量去维护一个复本,这样也就不存在同步等待问题了,当然,这样对于线程间通信就会有影响了(反正我不会线程通信)。

  最后,说点题外的,在linux系统里,是提倡多进程的,因为linux里面新开进程的开销是很小的,而windows就不会,windows系统里面开销大,所以对于多任务就会有多线程了,而linux中要解决的就是线程进程间通信了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值