• 关于

    多线程

    的搜索结果

回答

1、多线程最大的问题是线程安全问题、其次是线程调度问题、优先级2、Java多线程编程最好的方式是使用标准的线程池,标准线程池已经提供了复杂的线程管理机制,包括创建和销毁。3、你可以通过Executor来创建不同的线程池。newCachedThreadPool 创建一个动态线程池newFixedThreadPool 创建一个固定线程池newScheduledThreadPool 创建定时周期性任务线程池。newSingleThreadExecutor 创建一个单线程线程池这些内置的线程池,帮助我们完成了线程创建、回收、调度、优先级、等一系列问题,也可以参考JUC代码,大大降低我们多线程编程的复杂度。

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

回答

关于线程和线程池的学习,我们可以从以下几个方面入手: 第一,什么是线程,线程和进程的区别是什么 第二,线程中的基本概念,线程的生命周期 第三,单线程和多线程 第四,线程池的原理解析 第五,常见的几种线程池的特点以及各自的应用场景 一、 线程,程序执行流的最小执行单位,是行程中的实际运作单位,经常容易和进程这个概念混淆。那么,线程和进程究竟有什么区别呢?首先,进程是一个动态的过程,是一个活动的实体。简单来说,一个应用程序的运行就可以被看做是一个进程,而线程,是运行中的实际的任务执行者。可以说,进程中包含了多个可以同时运行的线程。 二、 线程的生命周期,线程的生命周期可以利用以下的图解来更好的理解: 第一步,是用new Thread()的方法新建一个线程,在线程创建完成之后,线程就进入了就绪(Runnable)状态,此时创建出来的线程进入抢占CPU资源的状态,当线程抢到了CPU的执行权之后,线程就进入了运行状态(Running),当该线程的任务执行完成之后或者是非常态的调用的stop()方法之后,线程就进入了死亡状态。而我们在图解中可以看出,线程还具有一个则色的过程,这是怎么回事呢?当面对以下几种情况的时候,容易造成线程阻塞,第一种,当线程主动调用了sleep()方法时,线程会进入则阻塞状态,除此之外,当线程中主动调用了阻塞时的IO方法时,这个方法有一个返回参数,当参数返回之前,线程也会进入阻塞状态,还有一种情况,当线程进入正在等待某个通知时,会进入阻塞状态。那么,为什么会有阻塞状态出现呢?我们都知道,CPU的资源是十分宝贵的,所以,当线程正在进行某种不确定时长的任务时,Java就会收回CPU的执行权,从而合理应用CPU的资源。我们根据图可以看出,线程在阻塞过程结束之后,会重新进入就绪状态,重新抢夺CPU资源。这时候,我们可能会产生一个疑问,如何跳出阻塞过程呢?又以上几种可能造成线程阻塞的情况来看,都是存在一个时间限制的,当sleep()方法的睡眠时长过去后,线程就自动跳出了阻塞状态,第二种则是在返回了一个参数之后,在获取到了等待的通知时,就自动跳出了线程的阻塞过程 三、 什么是单线程和多线程? 单线程,顾名思义即是只有一条线程在执行任务,这种情况在我们日常的工作学习中很少遇到,所以我们只是简单做一下了解 多线程,创建多条线程同时执行任务,这种方式在我们的日常生活中比较常见。但是,在多线程的使用过程中,还有许多需要我们了解的概念。比如,在理解上并行和并发的区别,以及在实际应用的过程中多线程的安全问题,对此,我们需要进行详细的了解。 并行和并发:在我们看来,都是可以同时执行多种任务,那么,到底他们二者有什么区别呢? 并发,从宏观方面来说,并发就是同时进行多种时间,实际上,这几种时间,并不是同时进行的,而是交替进行的,而由于CPU的运算速度非常的快,会造成我们的一种错觉,就是在同一时间内进行了多种事情 而并发,则是真正意义上的同时进行多种事情。这种只可以在多核CPU的基础下完成。 还有就是多线程的安全问题?为什么会造成多线程的安全问题呢?我们可以想象一下,如果多个线程同时执行一个任务,name意味着他们共享同一种资源,由于线程CPU的资源不一定可以被谁抢占到,这是,第一条线程先抢占到CPU资源,他刚刚进行了第一次操作,而此时第二条线程抢占到了CPU的资源,name,共享资源还来不及发生变化,就同时有两条数据使用了同一条资源,具体请参考多线程买票问题。这个问题我们应该如何解决那?   有造成问题的原因我们可以看出,这个问题主要的矛盾在于,CPU的使用权抢占和资源的共享发生了冲突,解决时,我们只需要让一条线程战歌了CPU的资源时,阻止第二条线程同时抢占CPU的执行权,在代码中,我们只需要在方法中使用同步代码块即可。在这里,同步代码块不多进行赘述,可以自行了解。 四,线程池 又以上介绍我们可以看出,在一个应用程序中,我们需要多次使用线程,也就意味着,我们需要多次创建并销毁线程。而创建并销毁线程的过程势必会消耗内存。而在Java中,内存资源是及其宝贵的,所以,我们就提出了线程池的概念。 线程池:Java中开辟出了一种管理线程的概念,这个概念叫做线程池,从概念以及应用场景中,我们可以看出,线程池的好处,就是可以方便的管理线程,也可以减少内存的消耗。 那么,我们应该如何创建一个线程池那?Java中已经提供了创建线程池的一个类:Executor 而我们创建时,一般使用它的子类:ThreadPoolExecutor. public ThreadPoolExecutor(int corePoolSize,                                int maximumPoolSize,                                long keepAliveTime,                                TimeUnit unit,                                BlockingQueue workQueue,                                ThreadFactory threadFactory,                                RejectedExecutionHandler handler)这是其中最重要的一个构造方法,这个方法决定了创建出来的线程池的各种属性,下面依靠一张图来更好的理解线程池和这几个参数: 又图中,我们可以看出,线程池中的corePoolSize就是线程池中的核心线程数量,这几个核心线程,只是在没有用的时候,也不会被回收,maximumPoolSize就是线程池中可以容纳的最大线程的数量,而keepAliveTime,就是线程池中除了核心线程之外的其他的最长可以保留的时间,因为在线程池中,除了核心线程即使在无任务的情况下也不能被清除,其余的都是有存活时间的,意思就是非核心线程可以保留的最长的空闲时间,而util,就是计算这个时间的一个单位,workQueue,就是等待队列,任务可以储存在任务队列中等待被执行,执行的是FIFIO原则(先进先出)。threadFactory,就是创建线程的线程工厂,最后一个handler,是一种拒绝策略,我们可以在任务满了知乎,拒绝执行某些任务。 线程池的执行流程又是怎样的呢? 有图我们可以看出,任务进来时,首先执行判断,判断核心线程是否处于空闲状态,如果不是,核心线程就先就执行任务,如果核心线程已满,则判断任务队列是否有地方存放该任务,若果有,就将任务保存在任务队列中,等待执行,如果满了,在判断最大可容纳的线程数,如果没有超出这个数量,就开创非核心线程执行任务,如果超出了,就调用handler实现拒绝策略。 handler的拒绝策略: 有四种:第一种AbortPolicy:不执行新任务,直接抛出异常,提示线程池已满              第二种DisCardPolicy:不执行新任务,也不抛出异常              第三种DisCardOldSetPolicy:将消息队列中的第一个任务替换为当前新进来的任务执行              第四种CallerRunsPolicy:直接调用execute来执行当前任务 五,四种常见的线程池: CachedThreadPool:可缓存的线程池,该线程池中没有核心线程,非核心线程的数量为Integer.max_value,就是无限大,当有需要时创建线程来执行任务,没有需要时回收线程,适用于耗时少,任务量大的情况。 SecudleThreadPool:周期性执行任务的线程池,按照某种特定的计划执行线程中的任务,有核心线程,但也有非核心线程,非核心线程的大小也为无限大。适用于执行周期性的任务。 SingleThreadPool:只有一条线程来执行任务,适用于有顺序的任务的应用场景。 FixedThreadPool:定长的线程池,有核心线程,核心线程的即为最大的线程数量,没有非核心线程 作者:weixin_40271838 来源:CSDN 原文:https://blog.csdn.net/weixin_40271838/article/details/79998327 版权声明:本文为博主原创文章,转载请附上博文链接!

auto_answer 2019-12-02 01:56:43 0 浏览量 回答数 0

回答

线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程就发生了线程安全问题,表现形式为数据的缺失,数据不一致等。 线程安全问题发生的条件:     1)多线程环境下,即存在包括自己在内存在有多个线程。     2)多线程环境下存在共享资源,且多线程操作该共享资源。     3)多个线程必须对该共享资源有非原子性操作。

有头发的程序猿 2019-12-02 03:13:21 0 浏览量 回答数 0

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

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

回答

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

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

回答

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

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

问题

yarn中同一个container的private和application资源下载时,把一个单线程的线程池改成多线程,这样会导致冲突吗?

hbase小助手 2019-12-01 20:28:02 509 浏览量 回答数 1

回答

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

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

回答

多线程并发的处理,这里指的是服务器端,也就是 Java 的处理,与页面无关。 首先,当多个请求同时到达服务器时,服务器会分配线程来执行每个请求(如果请求数量太多,能用的线程有限,则会进行排队)。所以请求和请求之间首先是一个线程隔离的环境。 每个线程都会按照同样的顺序执行同样的代码(这里简单的不考虑分支),在执行代码的过程中,线程会访问和操作各种各样的对象和变量。所以这里就有一个问题:我怎么知道多个线程会不会访问到同一个对象,或者同一个变量呢?如果这样的事情发生了,可能会产生什么后果呢? 在详细解释这个问题之前,首先需要明确一个简单的原则:任何对象都可以被任意多个线程访问,这是代码的自由性决定的。但更重要的是,我们可以让对象主动掌控线程对自己的访问。 最简单的控制方式就是 synchronized,意即同时只允许一个线程访问,其它线程必须先等待。当 synchronized 用在方法上时,表示同一时间只允许一个线程执行这个方法。 那么是否意味着服务器上的所有方法都必须是synchronized的呢?不是。当一个方法执行时,所有的变量和参数都会保存在一个叫做堆栈的内存空间,这个内存空间是线程独享的,所以线程之间不会相互冲突。例如: public void hello(String name) { String greetings = "Hello, " + name; System.out.println(greetings); }当多个线程执行 hello() 方法时,每个线程都会在自己的堆栈中存放 name 参数和 greetings 变量。其中 greetings 变量是在方法内定义的,一个线程中的 greetings 变量与另一个线程中的 greetings 变量将是完全隔离的,不会相互影响。 堆栈是线程独享的,但是放入堆栈的内容则未必。像上面的例子,greetings 变量是线程自己创建的,所以其它线程访问不到,但 name 参数则未必,有可能多个线程在执行这个方法时,收到的 name 参数是同一个对象。这时候如果方法里面要修改这个对象,那就要小心了。

a123456678 2019-12-02 02:05:43 0 浏览量 回答数 0

问题

linux进程在什么情况下需要创建线程?

a123456678 2019-12-01 19:55:15 1069 浏览量 回答数 1

回答

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

小柯卡力多 2019-12-02 03:22:01 0 浏览量 回答数 0

回答

就是线程同步的意思,就是当一个程序对一个线程安全的方法或者语句进行访问的时候,其他的不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问 什么叫线程安全: 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的, 就是线程安全的。 或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。 线程安全问题都是由全局变量及静态变量引起的。 若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。

1252111517567195 2019-12-02 01:02:55 0 浏览量 回答数 0

回答

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

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

回答

你目前这个系统已经是多线程的了。spring mvc封装的servlet request是多线程的。数据库操作也是多线程的。除非你的web容器比如tomcat设置了线程池就一个线程(单线程),然后数据库连接池也只开了一个线程。你需要找到的是目前系统的瓶颈在哪里,具体问题具体解决。否则所谓的多线程问题是个空谈。

a123456678 2019-12-02 02:14:14 0 浏览量 回答数 0

回答

线程是进程的组成部分,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程可以拥有自己的堆栈、自己的程序计数器和自己的局部变量,但不拥有系统资源,它与父进程的其他线程共享该进程所拥有的全部资源。因为多个线程共享父进程里的全部资源,因此编程更加方便;但必须更加小心,我们必须确保线程不会妨碍同一进程里的其他线程。线程可以完成一定的任务,可以与其他线程共享父进程中的共享变量及部分环境,相互之间协同来完成进程所要完成的任务。线程是独立运行的,它并不知道进程中是否还有其他线程存在。线程的执行是抢占式的,也就是说,当前运行的线程在任何时候都可能被挂起,以便另外一个线程可以运行。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。

星尘linger 2020-04-12 11:47:46 0 浏览量 回答数 0

问题

在C++11引入了对多线程语言级别的支持之后,还有必要学习posix线程吗?

a123456678 2019-12-01 20:11:46 1516 浏览量 回答数 1

回答

Java多线程编程最好的方式是使用标准的线程池,标准线程池已经提供了复杂的线程管理机制,包括创建和销毁。你可以通过Executor来创建不同的线程池。newCachedThreadPool 创建一个动态线程池newFixedThreadPool 创建一个固定线程池newScheduledThreadPool 创建定时周期性任务线程池。newSingleThreadExecutor 创建一个单线程线程池 大大降低我们多线程编程的复杂度。

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

回答

String StringBuffer StringBuilder String是不可变的对象,对每次String类型的改变都会生成一个新的对象,StringBufer和StringBuilder是可以改变对象的 效率:操作效率StringBuilder》Stringbuffer》String 线程安全:StringBuffer是线程安全,用于多线程,Stringbuilder是非线程安全,用于单线程          不频繁的字符串操作使用String,反之,Stringbuffer和Stringbuilder都优于String 线程安全是多线程编程时的计算机程序代码中的一个概念。 在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。 线程安全问题大多是由全局变量及静态变量引起的,局部变量逃逸也可能导致线程安全问题。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

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

回答

整体是多线程的。IO处理目前还是单线程模型,可以查看源码或者监控线程数量,但是Redis之父已经打算改IO模型为多线程方式,在Redis 6.0版本,有传闻。 Redis整体是多线程的,IO是单线程的。阿里也有IO多线程的实现版本。

徐雷frank 2019-12-02 02:02:09 0 浏览量 回答数 0

问题

对于单核cpu而言,开多线程的目的难倒只能是为了防止阻塞么?

a123456678 2019-12-01 20:09:56 1103 浏览量 回答数 1

回答

首先,你的代码没有问题,肯定是启动了3个线程来执行任务的。其次,分析下直接用main线程顺序执行三个操作,为什么比同时启动三个线程执行速度快呢?我认为这又可能跟操作系统处理IO的方式有关系,多线程并发处理IO时,操作系统底层响应IO的速度会影响线程的操作的。单线程环境下,顺序执行IO,操作系统可能不涉及到对IO请求的调用问题,但是多个线程同时发出IO请求命令时,操作系统底层的调度也有影响。你可以修正下你的测试内容,把Action中的Runnable的任务换成其他长时间计算任务,例如休眠操作,或者大数据计算操作,那么多线程的优势就体现出来了。修正测试内容: public void writeToTxt(String text) { int j=0; for(int i =0;i<1000000;i++){ j=i ; } System.out.println(Thread.currentThread().getName()+j); }最后,多线程提高效率体现在对整个功能完成时间上,是并行,而不会是纠结于单个任务完成过程中的处理时间;从理论上说,一个Runnable中执行完成的时间应该是差不多的,多线程的优势就是N个任务并行时,需要的总时间近似于完成一个任务的时间;而单线程时间则是N倍的单个任务的时间。而且多线程要考虑到线程池创建和调度的时间损耗,还是需要权衡的。像这种类似任务可以用java的线程池,可以免去线程创建和销毁的损耗。

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

回答

(1)线程的工作场景主要有两条: 一个是并发操作,避免阻塞和更有效利用资源。典型的例子有:在长时间工作的程序中使用工作线程避免界面失去响应。在网络下载程序中,使用多个线程提高对网络的使用效率,更快下载文件。 一个是并行,线程是处理器调度的最小单位。如果你的计算机配置了多个处理器或者内核,那么可以同时利用多个处理器同时计算,加快问题解决的速度。 (2)多线程的工作原理: 对于单处理器系统,操作系统会轮流调度每个线程执行一小段时间,然后切换另一个线程,在切换的时候,保存当前线程使用的寄存器上下文和堆栈,并且在下次调度的时候恢复。这样线程中的程序感觉不到自己被中断过。对于多处理器系统,操作系统会将不同的线程调度给多个处理器,让它们并行执行。

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

问题

问一下内存模型的问题,静态变量声明的变量,在多个线程中,什么时候会将其它线程变更的值,在本线程中获取到,即每个线程都有一个私有内存,在本线程访问时,访问的是私有内存,那么什么时候会去获取其它线程变更 的值?

李博 bluemind 2019-12-01 19:36:46 361 浏览量 回答数 2

回答

"总结起来,使用多线程编程具有如下几个优点。 进程之间不能共享内存,但线程之间共享内存非常容易。 系统创建进程时需要为该进程重新分配系统资源,但创建线程则代价小得多,因此使用多线程来实现多任务并发比多进程的效率高。 Java语言内置了多线程功能支持,而不是单纯地作为底层操作系统的调度方式,从而简化了Java的多线程编程。 在实际应用中,多线程是非常有用的,一个浏览器必须能同时下载多个图片;一个We b服务器必须能同时响应多个用户请求;Java虚拟机本身就在后台提供了一个超级线程来进行垃圾回收;图形用户界面(GUI)应用也需要启动单独的线程从主机环境收集用户界面事件……总之,多线程在实际编程中的应用是非常广泛的。"

星尘linger 2020-04-13 09:07:24 0 浏览量 回答数 0

回答

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

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

回答

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

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

回答

java是线程安全的,即对任何方法(包括静态方法)都可以不考虑线程冲突,但有一个前提,就是不能存在全局变量。如果存在全局变量,则需要使用同步机制。如下通过一组对比例子从头讲解:在多线程中使用静态方法会发生什么事?也就是说多线程访问同一个类的static静态方法会发生什么事?是否会发生线程安全问题?事实证明只要在静态函数中没有处理多线程共享数据,就不存在着多线程访问同一个静态方法会出现资源冲突的问题。下面看一个例子:实际执行的结果显示各个线程对静态方法的访问是交叉执行的,但是这并不影响各个线程静态方法print()中sum值的计算。也就是说,在此过程中没有使用全局变量的静态方法在多线程中是安全的,静态方法是否引起线程安全问题主要看该静态方法是否对全局变量(静态变量static member)进行修改操作。在多线程中使用同一个静态方法时,每个线程使用各自的实例字段(instance field)的副本,而共享一个静态字段(static field)。所以说,如果该静态方法不去操作一个静态成员,只在方法内部使用实例字段(instance field),不会引起安全性问题。但是,如果该静态方法操作了一个静态变量,则需要静态方法中采用互斥访问的方式进行安全处理。我们来看一下没有使用互斥访问的话会产生怎样的问题:实际运行结果显示i值为随机的数字。为了实现互斥访问,这时我们需要加入一个synchronized关键字。代码修改如下:运行结果则必然是100。加入synchronized关键字的静态方法称为同步静态方法。在访问同步静态方法时,会获取该类的“Class”对象,所以当一个线程进入同步的静态方法中时,线程监视器获取类本身的对象锁,其它线程不能进入这个类的任何静态同步方法。它不像实例方法,因为多个线程可以同时访问不同实例同步实例方法。这个其实就是操作系统中的用信号量实现进程的互斥与同步问题,如果涉及在同一个类中有多个静态方法中处理多线程共享数据的话,那就变成用信号量解决生产者-消费者问题。也就是说,静态方法是一份临界资源,对静态方法的访问属于进入临界区;对静态变量的修改是一份临界资源,对静态变量的修改属于进入临界区。

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

问题

linux多线程编程中如何等待过个线程退出

云栖技术 2019-12-01 19:44:12 1260 浏览量 回答数 1

问题

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

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

回答

什么叫线程安全: 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的, 就是线程安全的。 或者说:一个类或者程序所提供的接口对于线程来说是原子操作或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题。 线程安全问题都是由全局变量及静态变量引起的。 若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则就可能影响线程安全。

津崎平匡 2020-03-17 23:54:35 0 浏览量 回答数 0

问题

[@徐雷frank][¥20]作为java开发者应该处理多线程?怎么样编码好多线程程序?

管理贝贝 2019-12-01 19:23:14 529 浏览量 回答数 1
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 阿里云双十一主会场 阿里云双十一新人会场 1024程序员加油包 阿里云双十一拼团会场 场景化解决方案 阿里云双十一直播大厅 阿里云双十一企业上云会场