项目中怎么控制多线程高并发访问

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了项目中怎么控制多线程高并发访问相关的知识,希望对你有一定的参考价值。

1、首先明确信号量Semaphore的用法,然后新建一个项目,new-->file-->class,随意命名,此处命名为semaphoreDemo。

2、首先开始一个线程MyTask,实现接口,然后在其中定义窗口买票的流程,主要有进入,买完了,离开,释放信号量,让下一个进入。

3、然后设定一个信号量,主要是执行函数,此处定义窗口个数,定义线程池ExecutorService,循环执行这20个人。

4、最后通过main函数调用execute函数进行排队问题,开始排队线程。

5、在打印中可以看到两个线程在并发执行,剩下的人处于排队状态,只有上一个执行完了下一个才执行。

参考技术A

项目中控制多线程高并发访问的方法和详细的操作步骤如下:

1、首先,明确信号量Semaphore的用法,然后创建一个新项目,new--> file--> class,并根据需要命名它,这里命名为semaphoreDemo,如下图所示。

2、其次,启动一个线程MyTask,实现接口,然后定义窗口买票的流程,主要包括进入、购买、离开、释放信号量以及让下一个进入,如下图所示。

3、接着,设置一个信号量,主要是执行功能。 在这里,定义窗口数,定义线程池ExecutorService,并循环执行这20个人,如下图所示。

4、然后,由main函数调用execute函数以执行排队问题,并启动排队线程,如下图所示。

5、最后,在打印中,您可以看到两个线程正在同时执行,其余人员处于队列中。 仅当前一个完成时,才执行下一个,如下图所示。

参考技术B synchronized关键字主要解决多线程共享数据同步问题。
ThreadLocal使用场合主要解决多线程中数据因并发产生不一致问题。
ThreadLocal和Synchonized都用于解决多线程并发访问。但是ThreadLocal与synchronized有本质的区别:
synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本,使 得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。而Synchronized却正好相反,它用于在多个线程间通信 时能够获得数据共享。
Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。当然ThreadLocal并不能替代synchronized,它们处理不同的问题域。Synchronized用于实现同步机制,比ThreadLocal更加复杂。
1、Java中synchronized用法
使用了synchronized关键字可以轻松地解决多线程共享数据同步问题。
synchronized关键字可以作为函数的修饰符,也可作为函数内的语句,也就是平时说的同步方法和同步语句块。如果再细的分 类,synchronized可作用于instance变量、object reference(对象引用)、static函数和class literals(类名称字面常量)身上。
synchronized取得的锁都是对象;每个对象只有一个锁(lock)与之相关联;实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。

怎么理解分布式高并发多线程?

当提起这三个词的时候,是不是很多人都认为分布式=高并发=多线程?


当面试官问到高并发系统可以采用哪些手段来解决,或者被问到分布式系统如何解决一致性的问题,是不是一脸懵逼?

 

确实,在一开始接触的时候,不少人都会将三者混淆,误以为所谓的分布式高并发的系统就是能同时供海量用户访问,而采用多线程手段不就是可以提供系统的并发能力吗?实际上,他们三个总是相伴而生,但侧重点又有不同。


什么是分布式?


分布式更多的一个概念,是为了解决单个物理服务器容量和性能瓶颈问题而采用的优化手段。该领域需要解决的问题极多,在不同的技术层面上,又包括:分布式文件系统、分布式缓存、分布式数据库、分布式计算等,一些名词如Hadoop、zookeeper、MQ等都跟分布式有关。从理念上讲,分布式的实现有两种形式:

 

水平扩展:当一台机器扛不住流量时,就通过添加机器的方式,将流量平分到所有服务器上,所有机器都可以提供相当的服务;

 

垂直拆分:前端有多种查询需求时,一台机器扛不住,可以将不同的需求分发到不同的机器上,比如A机器处理余票查询的请求,B机器处理支付的请求。



什么是高并发?


相对于分布式来讲,高并发在解决的问题上会集中一些,其反应的是同时有多少量:比如在线直播服务,同时有上万人观看。


高并发可以通过分布式技术去解决,将并发流量分到不同的物理服务器上。但除此之外,还可以有很多其他优化手段:比如使用缓存系统,将所有的,静态内容放到CDN等;还可以使用多线程技术将一台服务器的服务能力最大化。



什么是多线程?



多线程是指从软件或者硬件上实现多个线程并发执行的技术,它更多的是解决CPU调度多个进程的问题,从而让这些进程看上去是同时执行(实际是交替运行的)。


这几个概念中,多线程解决的问题是最明确的,手段也是比较单一的,基本上遇到的最大问题就是线程安全。在JAVA语言中,需要对JVM内存模型、指令重排等深入了解,才能写出一份高质量的多线程代码。

 

总结一下:

 

分布式是从物理资源的角度去将不同的机器组成一个整体对外服务,技术范围非常广且难度非常大,有了这个基础,高并发、高吞吐等系统很容易构建;


● 高并发是从业务角度去描述系统的能力,实现高并发的手段可以采用分布式,也可以采用诸如缓存、CDN等,当然也包括多线程;

 

● 多线程则聚焦于如何使用编程语言将CPU调度能力最大化。

 

分布式与高并发系统,涉及到大量的概念和知识点,如果没有系统的学习,很容易会杂糅概念而辨识不清,在面试与实际工作中都会遇到困难。如果你从事Java开发,具备1年以上工作经验,希望深入浅出了解Java分布式、高并发等技术要点,渴望实现技术和职业成长上的双重突破,那么以下福利就很适合你:


福利1  免费直播课程


网易云课堂Java进阶面试系列免费直播课

适听人群:Java初、中级开发工程师


3.11-3.16  连续6天每晚8点准时直播

3月11日:面试季~听完次课,简历技能栏一定要加上消息中间件(MQ) 

3月12日:面试季~面试必问springboot知多少 - starter核心原理揭秘

3月13日:面试季~教你生产环境日志分析的正确姿势

3月14日:面试季~BIO和NIO别再傻傻分不清楚了

3月15日:面试季~Redis除了做缓存,还可以怎么用?

3月16日:面试季~面试问题线程池你能拿满分嘛? - 线程池原理与API精析


福利2  Java开发资料包


该资料包中主要包括「大数据容器数据库架构技术文档」、「大型公司技术文摘」、「Java开发参考书籍」、「Java开发学习图谱」等内容,全方位扩充你的知识体系。


想要参与Java进阶免费系列直播课

以及获取Java开发工程师资料包的同学,

可以长按扫描下方二维码,

添加网易云课堂Java课程助教小姐姐

免费课程,名额有限,先到先得~~

以上是关于项目中怎么控制多线程高并发访问的主要内容,如果未能解决你的问题,请参考以下文章

怎么理解分布式高并发多线程?(含面试题和答案解析)

怎么理解分布式高并发多线程?

Okhttp的线程池和高并发

怎么实现springMVC 多线程并发

多线程高并发和多线程的关系

高并发和多线程的关系