• 关于

    多线程并发

    的搜索结果

问题

java中什么是高并发和多线程?高并发和多线程有什么关系

蛮大人123 2019-12-01 20:27:07 3210 浏览量 回答数 2

回答

高并发不是JAVA的专有的东西,是语言无关的广义的,为提供更好互联网服务而提出的概念。举个极端的例子,就是100个人,1人分配1台web服务器,那么服务器资源是他们独占的,他们不需要抢占服务器资源,100个请求被100台服务器并行处理,速度必定很快,这就是高并发。当然这是不可能的,但是,我们总是努力去做,让少量的服务器也能达到近似的能力。这就需要服务器的HTML画面,后台业务逻辑,db数据存取等等细节上的处理都达到一个并行的极致,以此来实现整个服务器对所有请求的高并行。这是战略上的并行。多线程只是为了达到高并发目的,在某个细节点上,为实现某并发功能而采用的一种具体的实现方法,这种功能也可以由多进程实现,当然,也可以由多进程,多线程一起实现。这是战术上的并行。那么可以说,高并发是目的,多线程是某种手段(不是唯一的),高并发可以由多线程实现,但是多线程不代表就是高并发。

蛮大人123 2019-12-02 02:14:59 0 浏览量 回答数 0

问题

线程并行使用线程池并发操作 2800 多条线程,时间反而用时比不用线程池更大?原因是什么?

问问小秘 2020-01-02 11:27:24 3 浏览量 回答数 1

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

回答

高并发是目的,多线程是某种手段(不是唯一的),高并发可以由多线程实现,但是多线程不代表就是高并发,说的好

墨少伶 2019-12-02 02:14:59 0 浏览量 回答数 0

回答

首先强调背景: 1、GIL是什么?GIL的全称是Global Interpreter Lock(全局解释器锁),来源是python设计之初的考虑,为了数据安全所做的决定。 2、每个CPU在同一时间只能执行一个线程(在单核CPU下的多线程其实都只是并发,不是并行,并发和并行从宏观上来讲都是同时处理多路请求的概念。但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。)在Python多线程下,每个线程的执行方式:1、获取GIL2、执行代码直到sleep或者是python虚拟机将其挂起。3、释放GIL可见,某个线程想要执行,必须先拿到GIL,我们可以把GIL看作是“通行证”,并且在一个python进程中,GIL只有一个。拿不到通行证的线程,就不允许进入CPU执行。在Python2.x里,GIL的释放逻辑是当前线程遇见IO操作或者ticks计数达到100(ticks可以看作是Python自身的一个计数器,专门做用于GIL,每次释放后归零,这个计数可以通过 sys.setcheckinterval 来调整),进行释放。而每次释放GIL锁,线程进行锁竞争、切换线程,会消耗资源。并且由于GIL锁存在,python里一个进程永远只能同时执行一个线程(拿到GIL的线程才能执行),这就是为什么在多核CPU上,python的多线程效率并不高。

ylrf1212 2019-12-02 01:06:16 0 浏览量 回答数 0

问题

对c++多线程编程中信号量的疑惑,求解

a123456678 2019-12-01 20:11:06 888 浏览量 回答数 1

回答

关于python进程,线程,协程的关系。 1.进程可以按cpu核数去并发。 2.线程严格上说不是真正的多线程,因为GIL全局解释锁(这个自己去百度) 3.协程又叫微线程,这个本身只占用一个线程。是基于程序级切换。本身有自己的寄存器进行上下文切换。 所以协程真正支持成千上万的并发。 但是缺点也很明显,只能用一个核的cpu不能解决高利用。那么最佳搭配来了。 多进程+协程。 python并发推荐多进程+协程。

游客aasf2nc2ujisi 2019-12-02 03:10:10 0 浏览量 回答数 0

回答

1)HashTable是线程安全的,其提供的public方法上都加了synchronized关键字,效率是比较低的;2)HashMap是非线程安全的,多线程操作会导致并发冲突异常,单线程场景高效;3)ConcurrentHashMap是线程安全的,与HashTable的实现机制不同,并没有通过加synchronized关键字的方式实现同步锁,在java8之前它是通过分段(segment)锁的方式来实现的,降低并发冲突,但是在java8中实现方式上有所调整,采取按行加锁,进一步降低并发冲突概率,具体可以参考jdk8源码实现

talishboy 2019-12-02 01:46:43 0 浏览量 回答数 0

回答

并发跟序列化没有关系,并发是程序中使用多线程处理问题,并发需要注意共享数据的同步访问控制,因为Java的堆内存是多线程共享的,所以对内存中的数据即对象,也是共享的,所以这就需要考虑线程安全问题。而序列化的作用主要是便于数据网络传输,是远程方法调用的基础。二者没有关系的。

蛮大人123 2019-12-02 02:37:10 0 浏览量 回答数 0

问题

[@项籍][¥20]多线程并发速度

有点忧伤 2019-12-01 20:26:23 492 浏览量 回答数 2

回答

(1)高并发、任务执行时间短的业务,线程池线程数可以设置为CPU核数+1,减少线程上下文的切换 (2)并发不高、任务执行时间长的业务要区分开看:   a)假如是业务时间长集中在IO操作上,也就是IO密集型的任务,因为IO操作并不占用CPU,所以不要让所有的CPU闲下来,可以适当加大线程池中的线程数目,让CPU处理更多的业务   b)假如是业务时间长集中在计算操作上,也就是计算密集型任务,这个就没办法了,和(1)一样吧,线程池中的线程数设置得少一些,减少线程上下文的切换 (3)并发高、业务执行时间长,解决这种类型任务的关键不在于线程池而在于整体架构的设计,看看这些业务里面某些数据是否能做缓存是第一步,增加服务器是第二步,至于线程池的设置,设置参考(2)。最后,业务执行时间长的问题,也可能需要分析一下,看看能不能使用中间件对任务进行拆分和解耦。

天雷henry 2019-12-02 01:49:33 0 浏览量 回答数 0

回答

线程数并发并不是越多越好,当并发数使CPU饱和以后,每个线程都会存在大量时间在等待抢占cpu时间片,这时每个线程的处理时间就会拉长。所以设置的线程数还是要根据硬件条件去调配,可以参考网上一些线程数和cpu的配比的文章,实际还是需要根据项目调优选择合适的值。

烈侯 2019-12-02 01:46:04 0 浏览量 回答数 0

问题

单线程多路复用和多线程加锁的区别

a123456678 2019-12-01 20:10:07 1841 浏览量 回答数 2

回答

问题很好。Java的多线程编程是很重要的知识点。Java程序员可以看看《Java并发编程的艺术》相关的书籍,目前对于大部分Java程序员来说,做好多线程编程,最好是依赖底层的框架。相对来说出问题的概率比较低,而且容易实现。如果非常熟练,可以参考编写一些多线程的代码。Java多线程目前封装比较好的框架是JUC库。可以直接使用。多线程,如果数据都是隔离,每个线程单独所有,不会出现线程安全问题,相对简单。但是如果涉及到共享问题,就比较麻烦。涉及线程安全必然有锁的问题,Lock和Synchronized关键字的使用。共享资源加锁,一般说为悲观锁,必然会导致其他线程等待,尽快处理,及时释放是最好的策略。如果是乐观锁,并发问题相对处理简单,但是无法保证数据一致性。Lock接口允许自己实现共享资源的锁定和释放,效率高,编码工作量大。Synchronized相对简单,关键字,但是性能不如Lock.你提到的CAS也是CPU低等的指令。效率比较高。如果可以尽量使用现有的Java多线程框架,可以降低底层的编码实现难度,线程调度和锁机制太复杂。积累一定经验,或者项目实在需要,标准框架无法满足的时候,可以尝试优化,或者自己实现多线程代码。

徐雷frank 2019-12-02 01:45:57 0 浏览量 回答数 0

问题

netty线程阻塞,自定义业务逻辑处理线程池问题:报错

kun坤 2020-06-08 19:17:58 0 浏览量 回答数 1

回答

进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。 线程:是进程的一个执行单元,是进程内科调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。 一个程序至少一个进程,一个进程至少一个线程。 进程线程的区别:     地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。     资源拥有:同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的。      一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。 进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程     执行过程:每个独立的进程程有一个程序运行的入口、顺序执行序列和程序入口。但是线程不能独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。     线程是处理器调度的基本单位,但是进程不是。 两者均可并发执行。 线程安全是多线程编程时的计算机程序代码中的一个概念。 在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。 线程安全问题大多是由全局变量及静态变量引起的,局部变量逃逸也可能导致线程安全问题。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

问问小秘 2020-01-03 13:53:34 0 浏览量 回答数 0

回答

单体服务线程安全可使用Synchronized和ReentrantLock锁住相关代码,锁对象或是块必须是多线程共享的。 unsafe提供的CAS或是手动定义的乐观锁在并发较小但是有并发可能的情况下可以使用。 确保共享变量和对象的访问是串行的,或整体操作是原子的(例如不并发使用SimpleDataFormat);并发的数据修改要选择使用线程安全的静态类,如JUC包下的ConsurrentHashMap等。

carson夏 2019-12-02 03:13:45 0 浏览量 回答数 0

问题

C++11 有关并发的教程里面保护共享数据部分

a123456678 2019-12-01 20:05:50 1032 浏览量 回答数 1

回答

1,线程(Thread) 使用多线程可以有效的利用CPU资源(Python例外)。然而多线程所带来的程序的复杂度也不可避免,尤其是对竞争资源的同步问题。 然而在python中由于使用了全局解释锁(GIL)的原因,代码并不能同时在多核上并发的运行,也就是说,Python的多线程不能并发,使用多线程来改进自己的Python代码后,程序的运行效率却下降了。 实际上使用多线程的编程模型是很困难的,程序员很容易犯错,这并不是程序员的错误,因为并行思维是反人类的,我们大多数人的思维是串行,而且冯诺依曼设计的计算机架构也是以顺序执行为基础的。所以如果你总是不能把你的多线程程序搞定。 Python提供两组线程的接口:一是thread模块,提供基础的,低等级(Low Level)接口,使用Function作为线程的运行体。还有一组是threading模块,提供更容易使用的基于对象的接口(类似于Java),可以继承Thread对象来实现线程,还提供了其它一些线程相关的对象。例如Timer,Lock : 使用thread模块的例子: import threaddef worker(): """thread worker function""" print 'Worker' thread.start_new_thread(worker) 使用threading模块的例子: import threadingdef worker(): """thread worker function""" print 'Worker' t = threading.Thread(target=worker)t.start() 2,进程 (Process) 由于前文提到的全局解释锁的问题,Python下比较好的并行方式是使用多进程,这样可以非常有效的使用CPU资源,并实现真正意义上的并发。当然,进程的开销比线程要大,也就是说如果你要创建数量惊人的并发进程的话,需要考虑一下你的机器是不是有一颗强大的心。 Python的mutliprocess模块和threading具有类似的接口。 from multiprocessing import Process def worker(): """thread worker function""" print 'Worker' p = Process(target=worker)p.start()p.join() 由于线程共享相同的地址空间和内存,所以线程之间的通信是非常容易的,然而进程之间的通信就要复杂一些了。常见的进程间通信有: 管道,消息队列,Socket接口(TCP/IP)等等Python的mutliprocess模块提供了封装好的管道和队列,可以方便的在进程间传递消息。 Python进程间的同步使用锁,这一点和线程是一样的。 另外,Python还提供了进程池Pool对象,可以方便的管理和控制线程。 3,远程分布式主机 (Distributed Node) 随着大数据时代的到临,数据的计算和处理需要分布式的计算机网络来运行,程序并行的运行在多个主机节点上,已经是现在的软件架构所必需考虑的问题。 远程主机间的进程间通信有几种常见的方式 TCP/IP TCP/IP是所有远程通信的基础,然而API比较低级别,使用起来比较繁琐,所以一般不会考虑 ; 远程方法调用 Remote Function Call RPC是早期的远程进程间通信的手段。Python下有一个开源的实现RPyC ; 远程对象 Remote Object 远程对象是更高级别的封装,程序可以想操作本地对象一样去操作一个远程对象在本地的代理。

元芳啊 2019-12-02 01:09:33 0 浏览量 回答数 0

问题

MySQL数据库多线程并发怎么保证可靠

蛮大人123 2019-12-01 19:52:17 3264 浏览量 回答数 1

回答

补充楼下:多线程你可以理解为并行执行代码。 python:进程,线程,协程 1.python的多线程不是真正的多线程(简单理解,没有实现真正的并发执行) 原因是GIL解释锁, 线程1,锁定 其它线程,睡眠 线程1,执行100b 线程1,解锁 线程1,睡眠 线程N,锁定 其它线程轮换着执行以上步骤。

游客aasf2nc2ujisi 2019-12-02 03:11:36 0 浏览量 回答数 0

问题

redis以单线程模式实现的,如何保证其高性能?

落地花开啦 2019-12-01 19:58:16 1678 浏览量 回答数 1

回答

tomcat默认servlet是单例多线程模式。当容器收到一个Servlet请求,调度线程从线程池中选出一个工作者线程,将请求传递给该工作者线程,然后由该线程来执行Servlet的service方法。当这个线程正在执行的时候,容器收到另外一个请求,调度线程同样从线程池中选出另一个工作者线程来服务新的请求,容器并不关心这个请求是否访问的是同一个Servlet.当容器同时收到对同一个Servlet的多个请求的时候,那么这个Servlet的service()方法将在多线程中并发执行。对于Tomcat可以在server.xml中通过元素设置线程池中线程的数目。不过提醒一句,静态变量,这可不是线程安全的哦,要注意.

蛮大人123 2019-12-02 01:55:15 0 浏览量 回答数 0

回答

一个程序至少有一个进程,一个进程至少有一个线程。线程的划分尺度小于进程,使得多线程程序的并发性高。另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

景凌凯 2019-12-02 01:40:36 0 浏览量 回答数 0

回答

一个程序至少有一个进程,一个进程至少有一个线程。线程的划分尺度小于进程,使得多线程程序的并发性高。另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

景凌凯 2019-12-02 01:40:36 0 浏览量 回答数 0

回答

Re分享:OSS在多线程并发上传的测速 一直愁这个问题 单线程只有1mb/s的速度 ------------------------- Re分享:OSS在多线程并发上传的测速 但我这边是PHP上传的,

sonnyboy 2019-12-02 03:11:03 0 浏览量 回答数 0

回答

如果java编程能力很强,可以自己控制线程代码编写和实现,包括线程安全,任务调度现在目前看比较简单高效的方式是基于JUC并发编程库实现。底层已经封装了并发、多线程、任务调度的机制。包括队列、锁、信号量等机制,。

徐雷frank 2019-12-02 01:44:22 0 浏览量 回答数 0

回答

先谈谈题主说的这两种服务器模型:1、收到一个请求就处理,这个时候就不能处理新的请求,这种为阻塞 这个是单线程模型,无法并发,一个请求没处理完服务器就会阻塞,不会处理下一个请求。一般的服务器不会使用这种方式实现。2、收到一个请求就新开一个线程去处理任务,主线程返回,继续处理下一个任务,这种为非阻塞 首先纠正一个错误,这并不是非阻塞,它也是阻塞的。相对第一个模型来说,它解决了主线程阻塞的问题,有了一定程度的并发量,但是在每个新开的线程中还是阻塞的。如果100个人同时访问,将会开100个线程,那1000个人,10000个人呢?频繁开关线程很消耗资源,这样实现的服务器性能依然不高。除了上面的两种方式,接下来的说说其他更好的方式:3、类似2的模型,但是不是每次收到请求就开一个新的线程,而是使用线程池 如果不了解线程池,你可能会了解数据库连接池,由于频繁创建、关闭数据库连接会消耗资源,所以会用数据库连接池来保存一定数量的连接,如果需要就从连接池里取连接,不需要则放回连接池,不在频繁创建。线程池也是一样的道理,线程池管理多线程,性能比频繁创建线程高得多。这种方式实现的服务器性能会比2高。不过,它依然是阻塞的。线程池的线程数量通常有限制的,如果所有线程都被阻塞(例如网速慢,或者被人恶意占用连接),那么接下来的请求将会排队等待。4、基于Java NIO实现的服务器模型 上面说到的几种模型,都是基于BIO(阻塞IO)。而NIO则是非阻塞IO,它是基于IO多路复用技术(例如Reactor模式)实现,只需要一个线程或者少量线程,就可以处理大量请求。从性能上来说NIO实现的服务器并发性一般大于BIO,所以可以实现高性能的服务器。如果感兴趣,可以学习一些基于NIO的网络编程框架,例如Netty、MINA。最后,回答一下题主说到的Tomcat。Tomcat运行可以选择BIO或者NIO模型,原理分别对应上面的3和4两种方式。Tomcat默认是BIO方式运行,如果想要换成NIO,可以配置server.xml:从性能上考虑建议使用NIO。

蛮大人123 2019-12-02 01:52:18 0 浏览量 回答数 0

问题

处理一个web请求涉及很多数据库查询,那么将Tomcat配置成NIO线程模型会不会反而降低并发能力?

小旋风柴进 2019-12-01 20:06:03 1022 浏览量 回答数 1

回答

你的问题要分开来看,线程数多了性能反而差和如何解决高并发问题两个问题 线程数多了性能反而差 1.伴随线程数的加剧,cpu和内存的开销也会伴随着增长,最直观的体现的sys增长,分配给业务线程使用的cpu时钟相应会降低;其次线程分配的内存开销无疑家居了GC的开销,对吞吐的影响也是不低2.如果VM和JVM并没有到瓶颈,这个时候需要考虑是否受限于锁和IO。举个例子logger同步锁和依赖的外部IO瓶颈 解决高并发问题 关于这个问题需要视情况而定了1.如果是CPU密集型应用,IO并非瓶颈,可以考虑通过充分使用cpu核数来提高并行度,一般配置cpu core线程即可2.如果是IO密集型应用,应用的瓶颈集中在外部IO,在外部IO负载范围内可以通过增加线程数的方式解决吞吐问题3.如果计算任务涉及到锁竞争,可以考虑降低锁的粒度或者取消锁,举个例子ringbuffer4.基于之上的场景如果需要继续提高并发度,可以考虑做一些热点优化,举个例子热点缓存优化,热点缓存本地优化(不过这个时候就需要考虑本地缓存的大小和失效时间,过长会导致老年代增长过快,触发FGC,这个时候反而得不偿失,经验值一般是20s之内)5.有的时候也可以考虑用空间换时间,在一些数据封板的场景可以考虑预计算&缓存代替实时计算提高并发度6.有的时候需要对业务逻辑进行裁剪,针对于不同场景进行计算流程的自定义,裁剪掉不必要的开销7.一些中间件、jvm和os的优化就不在这个话题里描述了

项籍 2019-12-02 01:42:08 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站