多线程的使用场景(如何在两个线程间共享数据)
本文目录
如何在两个线程间共享数据
ps:由于最近的面试很多问题都涉及多线程,自己感觉以前学的还是太浅,再展开学学吧。
今天先从考的比较频繁的“多线程共享数据”开始。
一.目标
谈到多线程共享数据,理想情况下我们希望做到“同步”和“互斥”。这是目标我们暂且把它先放到这。
二.分类
多线程共享数据通常的场景有一下两种:
场景一:
卖票,我们都买过火车票。要买火车票我们可以去车站,也可以通过代售点(或网购),但不管有多少种方式火车票的总数是一定的。
场景抽象:
对于卖票系统每个线程的核心执行的代码都相同(就是票数--)。
解决方法:
只需创建一个Runnable,这个Runnable里有那个共享数据。
代码模拟:
Java代码
package 多线程共享数据;
public class Ticket implements Runnable{
private int ticket = 10;
public void run() {
while(ticket》0){
ticket--;
*****("当前票数为:"+ticket);
}
}
}
C++中程序在哪些场合应该使用多线程
用一句话来回答就是:当你想一心二用的时候你就应该使用多线程!比如我现在想一边敲这些字一边和可乐就得用多线程。在你炒菜的同时又要烧水也得用多线程(并发)。。当你很用心在写一段很长的代码的时候,如果别人在这个时候叫你,你不希望听不见那么也得用多线程(防止阻塞,UI假死)。再比如分房的年代,如果是按照人头分房,你希望分的房子大一点那么你也得用多线程(可能会获得更多的CPU时间片,特别是在多核上)。如果你是一个创业者,当你的公司渐渐的长大,人越来越多,事情也越来越复杂的时候,你希望不同的人去做不同的事情,你希望把更多的资源给重要的人,而不希望(至少希望不是很多)那些不太重要的事情占用你某些宝贵的资源的时候,你也得用多线程(优先级)。因此我认为有四种情况,我们是需要使用多线程的。即:
1. 有多件事情,顺序执行无法满足的时候;
2. 在处理长时间的事情(算法)时为了防止应用界面(UI)不响应用户输入,造成UI假死的时候;比如大图像渲染、大数据处理/排序、搜索等
3. 为了通过获得更多的CPU时间片来提高程序效率的时候;
4. 需要同时处理的事情有优先级别的时候;应该使用高优先级线程管理对时间要求很急的任务,而使用低优先级线程执行被动任务或者对时间不敏感的任务。
java电商项目,什么场景需要使用多线程
这个很简单,高并发有多种解决方法:
1、从代码上分入手,必须得保证代码没有冗余,不要有废代码;
2、从服务器上入手,高并发一台服务器并发量有限,我们可以采用多台服务器来分担压力;
3、从存储方便入手,像我们一般高并发但是数据却可以不用存到数据库中的,我们就存在内存中,因为读内存的速度是数据库的N倍。
Linux下多线程和多进程程序的优缺点,各个适合什么样的业务场景
IBM有个家伙做了个测试,发现切换线程context的时候,windows比linux快一倍多。进出最快的锁(windows2k的 critical section和linux的pthread_mutex),windows比linux的要快五倍左右。当然这并不是说linux不好,而且在经过实际编程之后,综合来看我觉得linux更适合做high performance server,不过在多线程这个具体的领域内,linux还是稍逊windows一点。这应该是情有可原的,毕竟unix家族都是从多进程过来的,而 windows从头就是多线程的。
如果是UNIX/linux环境,采用多线程没必要。
多线程比多进程性能高?误导!
应该说,多线程比多进程成本低,但性能更低。
在UNIX环境,多进程调度开销比多线程调度开销,没有显著区别,就是说,UNIX进程调度效率是很高的。内存消耗方面,二者只差全局数据区,现在内存都很便宜,服务器内存动辄若干G,根本不是问题。
多进程是立体交通系统,虽然造价高,上坡下坡多耗点油,但是不堵车。
多线程是平面交通系统,造价低,但红绿灯太多,老堵车。
我们现在都开跑车,油(主频)有的是,不怕上坡下坡,就怕堵车。
高性能交易服务器中间件,如TUXEDO,都是主张多进程的。实际测试表明,TUXEDO性能和并发效率是非常高的。TUXEDO是贝尔实验室的,与UNIX同宗,应该是对UNIX理解最为深刻的,他们的意见应该具有很大的参考意义。
多线程的优点:
无需跨进程边界;
程序逻辑和控制方式简单;
所有线程可以直接共享内存和变量等;
线程方式消耗的总资源比进程方式好;
多线程缺点:
每个线程与主程序共用地址空间,受限于2GB地址空间;
线程之间的同步和加锁控制比较麻烦;
一个线程的崩溃可能影响到整个程序的稳定性;
到达一定的线程数程度后,即使再增加CPU也无法提高性能,例如Windows Server 2003,大约是1500个左右的线程数就快到极限了(线程堆栈设定为1M),如果设定线程堆栈为2M,还达不到1500个线程总数;
线程能够提高的总性能有限,而且线程多了之后,线程本身的调度也是一个麻烦事儿,需要消耗较多的CPU
多进程优点:
每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;
通过增加CPU,就可以容易扩充性能;
可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;
每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大
多线程缺点:
逻辑控制复杂,需要和主程序交互;
需要跨进程边界,如果有大数据量传送,就不太好,适合小数据量传送、密集运算
多进程调度开销比较大;
最好是多进程和多线程结合,即根据实际的需要,每个CPU开启一个子进程,这个子进程开启多线程可以为若干同类型的数据进行处理。当然你也可以利用多线程+多CPU+轮询方式来解决问题……
方法和手段是多样的,关键是自己看起来实现方便有能够满足要求,代价也合适。
更多文章:
java移位运算有什么作用(在java中, 一个数左移n位,就是将这个数乘以2的n次方,右移就是将这个数除以2的n次方怎么理解)
2026年5月9日 21:40
2016excel教程自学网(excel2016包含公式怎么操作)
2026年5月9日 21:20
cellpadding英文(html 的 元素和属性的英文全称都是什么)
2026年5月9日 19:20






