关闭

线程并发一:概念理解

标签: 线程并发异步多线程
109人阅读 评论(0) 收藏 举报
分类:

1.同步(Synchronous) 和异步(Asynchronous)

同步和异步通常来形容一次方法的调用,同步方法调用一旦开始,调用者必须等到方法调用结束才成继续后续的行为。异步方法调用更像一个消息传递,一旦开始,方法调用就会立即返回调用者可以继续后续的操作。如果异步调用需要返回结果,那么当这个异步调用真实完成时,则会通知调用者。

2.临界区
临界区一般用来表示多线程的共享资源数据。也就是并发情况下要保护的对象。

3.阻塞(Blocking)和非阻塞(Non-Blocking)
阻塞和非阻塞一般用来多线程之间的相互影响或对IO的操作。当一个线程占用了临界区的资源,其他线程线程在调用临界区资源的时候必须等待,等待会导致线程挂起,这种情况就是阻塞。如果当前线程不释放临界区资源,那么其他所用线程都将不能工作
非阻塞:强调没用一个线程可以妨碍其他线程执行,所用线程都会不断尝试获取临界区资源,获取不到直接返回,下次再获取。

4. 死锁(Deadlock)、饥饿(Starvation)、活锁(Livelock)
几种状态都属于多线程活跃性的问题,当出现这种问题的时候,也就表明相关线程出现了问题,很难再执行下去

死锁:是最糟糕的一个问题,是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外部处理作用,它们都将无限等待下去。

死锁形成条件:
互斥条件:所谓互斥就是进程在某一时间内独占资源。
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系

死锁形成的常见情况有以下几种:

a.忘记释放锁

b.单线程重复申请锁

void sub_func()
{
    EnterCriticalSection();
    do_something();
    LeaveCriticalSection();
}
​
void data_process()
{
    EnterCriticalSection();
    sub_func();
    LeaveCriticalSection();
}

c.多线程多锁申请

void data_process1()
{
    EnterCriticalSection(&cs1);  // 申请锁的顺序有依赖
    EnterCriticalSection(&cs2);
    do_something1();
    LeaveCriticalSection(&cs2);
    LeaveCriticalSection(&cs1);
}
​
void data_process2()
{
    EnterCriticalSection(&cs2);  // 申请锁的顺序有依赖
    EnterCriticalSection(&cs1);
    do_something2();
    LeaveCriticalSection(&cs1);
    LeaveCriticalSection(&cs2);
}

d.环形锁申请
/* 多个线程申请锁的顺序形成相互依赖的环形:
* A - B
* | |
* C - D
*/

饥饿:是指线程因种种原因无法获取所需要的资源导致一直无法执行。
一般会出现饥饿状态有两种原因:
a.某一线程一直占用资源
b.线程优先级问题

活锁:是指线程1可以使用资源,但它很礼貌,让其他线程先使用资源,线程2也可以使用资源,但它很绅士,也让其他线程先使用资源。这样你让我,我让你,那么就会出现资源不断在两个线程中跳动,而没有一个线程可以同时拿到所用资源而正常执行

5.线程优先级
Java中线程可以有自己的优先级,优先级高的线程在竞争资源时会更有优势,但如果无法精准控制多线程的优先级,会导致低优先级的线程可能一直抢占不到资源,从而始终无法运行。所以设置线程优先级要谨慎。在Java中,使用1 到10 表示线程优先级。一般可以使用Thread 类中内置的三个静态标量表示:

    /**
     * The minimum priority that a thread can have.
     */
    public final static int MIN_PRIORITY = 1;

   /**
     * The default priority that is assigned to a thread.
     */
    public final static int NORM_PRIORITY = 5;

    /**
     * The maximum priority that a thread can have.
     */
    public final static int MAX_PRIORITY = 10;

执行下面的示例,可以看到高优先级的线程在大部分情况下都会先执行完任务。

public class PriorityDemo {

    public static class HightThread extends Thread {
        static int count = 0;
        public void run(){
            while (true){
                synchronized (PriorityDemo.class){
                    count ++;
                    if(count > 1000000){
                        System.out.println("HightThread is complete!");
                        break;
                    }
                }
            }
        }
    }

    public static class LowThread extends Thread {
        static int count = 0;
        public void run(){
            while (true){
                synchronized (PriorityDemo.class){
                    count ++;
                    if(count > 1000000){
                        System.out.println("LowThread is complete!");
                        break;
                    }
                }
            }
        }
    }

    public static void main(String[] args){
        Thread high = new HightThread();
        Thread low = new LowThread();

        high.setPriority(Thread.MAX_PRIORITY);
        low.setPriority(Thread.MIN_PRIORITY);
        low.start();
        high.start();
    }
}
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

多线程 ---并发与并行概念总结

软件开发,网站开发过程中经常有并发,并行这样的多线程处理与应用。因此,有必要对其进行了解与掌握。多线程: 在了解线程之前,要先知道进程这个概念。进程是一个具有独立功能的程序关于某个数据集合的一次运行活...
  • qq_33290787
  • qq_33290787
  • 2016-06-30 15:17
  • 7911

Java中线程和进程的一些概念的理解

今天复习熟悉了Java并发的一些概念。  程序:系统要完成的一个任务,就是一个程序;  进程:每个运行中的程序就是一个进程,Windows任务管理器上可以看到每一个进程,Linux下使用ps –e...
  • li12412414
  • li12412414
  • 2016-05-17 16:06
  • 1633

关于java中的锁的理解(通俗易懂)

这是我看过的极好的一篇关于锁的机制的介绍,通俗易懂,非常好,采纳,接受,给赞
  • u012291108
  • u012291108
  • 2016-05-08 23:41
  • 3746

理解操作系统中进程和线程的概念,比较单进程和多进程的程序结构和执行方面的区别,指出多线程的好处

  • 2009-01-16 13:42
  • 1.11MB
  • 下载

进程、线程、并发执行的概念

于进程、线程、并发执行的概念,我们先来看下面的一段话:“一般来说,当运行一个应用程序的时候,就启动了一个进程,当然有些会启动多个进程。启动进程的时候,操作系统会为进程分配资源,其中最主要的资源是内存空...
  • zhongguowangzhan
  • zhongguowangzhan
  • 2017-11-16 15:29
  • 43

【Java并发编程实战】-----线程基本概念

学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的“系统”,需要自己好好总结、整理才能征服它。希望同仁们一起来学习Java并发编程,共...
  • chenssy
  • chenssy
  • 2015-07-26 10:56
  • 6676

并发的概念以及线程的控制

并发的概念以及线程的控制1.相关概念以及解释我们要使用并发,需要了解一下几个概念! 【名词解释】 1.应用程序: 为了完成特定的任务,用某种语言编写的一组指令程序(静态)2.进程 运行...
  • qq_36868342
  • qq_36868342
  • 2017-08-07 13:31
  • 89

Java线程、并发概念整理

一、进程和线程 进程: 进程一般由程序、数据集合和进程控制块三部分组成。程序用于描述进程要完成的功能,是控制进程执行的指令集;数据集合是程序在执行时所需要的数据和工作区;程序控制块(Program ...
  • song1041746117
  • song1041746117
  • 2017-07-31 17:59
  • 160

【java并发编程实战】-----线程基本概念

学习Java并发已经有一个多月了,感觉有些东西学习一会儿了就会忘记,做了一些笔记但是不系统,对于Java并发这么大的“系统”,需要自己好好总结、整理才能征服它。希望同仁们一起来学习Java并发编程,共...
  • qq_33762302
  • qq_33762302
  • 2017-02-09 15:46
  • 126

并发和并行 进程和线程的概念

并发和并行  ---并发指一个CPU可以异步的处理多个进程  ---并行则是一个CPU同时处理多个进程 对于多核心CPU我们可以把系统看做是运行在准并行环境中的进程集合。在进程(程序)间快速反复切换叫...
  • z862529671
  • z862529671
  • 2017-01-15 21:29
  • 183
    个人资料
    • 访问:570次
    • 积分:72
    • 等级:
    • 排名:千里之外
    • 原创:7篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档