• 多线程-三个最简单的同步机制的介绍


     线程的两种行进模式多线程

    并发和并行

    • 指的是两个或者多个事件(任务),在同一时间段 内发生的cpu在运行时,只执行了一个任务,但是会交替执行两个任务,两个馒头,这边一口,那边一口

    • 并行:指的是两个或者多个时间(任务)在同一时刻发生(同时发生), 两个任务同时操作

    计算机中线程与进程的概念

    线程与进程

    • 进程:是指一个内存中运行的应用程序,每个进程都有一个独立的内存空间,一个应用程序可以同时运行多个线程:进程也是程序的一次执行过程,是系统运行程序的基本单位(单元);系统运行一个程序就是一个进程从创建运行到消亡的过程

    • 线程:线程是进程执行中的一个执行单元,负责当前进程中程序的运行,一个程序中至少有一个线程.一个进程可以有多个线程,这个应用程序也可以称为多线程程序

    简而言之,一个程序运行后至少有一个进程,一个进程中可以包含多个线程.

    备注:单核处理器的计算机肯定不能并行的执行多个任务的,只能多个任务在单个cpu上并发的执行.同理,线程也是一样的,从宏观角度上理解线程是一种并行运行的,但是从微观上分析并行运行不可能,即需要一个一个线程的去执行,当系统只有一个cpu的时候,线程会以某种顺序执行多个线程,我们把这种情况称之为线程调度

    线程调度:

    • 分时调度:所有的线程轮流使用cpu的使用权,平均分配给每个线程占用cpu的时间

    • 抢占式调度:优先让优先级高的线程使用cpu,如果线程的优先级相同,那么会随机一个线程 执行,java使用的就是抢占式调度方式来运行线程程序.

    • 设置线程的优先级

    创建线程的两种方式

    一. 继承Thread

    实现步骤:

    • 1.创建一个Thread类的子类

    • 2.在Thread类的子类当中重写Thread类的run方法,设置线程任务(开启线程需要你做什么事情?)

    • 3.创建Thread类的子类对象

    • 4.调用Thread类中的方法start方法.开启新线程,执行run方法

      void start() java虚拟机调用该线程的run方法.

      结果是两个线程并发的运行:当前线程(从调用返回给start方法)和另一个线程(执行其run方法).

      多次启动一个线程是非法的.特别是当线程已经结束执行后,不能再重新启动.

      Java程序属于抢占式调度.那个线程的优先级高,哪个线程就优先执行.

      同一个优先级的线程,随机一个线程执行

      主线程和run线程是平级的,他会随机调用的Thread中的start方法会开启一条和main主线程并行的新线程,这个会和main线程 在cpu中和main线程并发,并且这个之间的跳转是完全随机的,

      多次调用一个线程是不行的,当线程结束,就没了,不能再次的调用

    二.实现Thread的子类Runnable,实现run方法

    步骤如下:

    1.定义Runnable接口的实现类,并重写该接口的run方法,该run方法的方法体同样是该线程的线程执行体.

    2.创建Runndable接口实现类的实例,并以此实例作为Thread的target来创建Thread对象,该Thread类的对象才是真正的线程对象/

    3.调用线程对象的start()方法来启动新线程.

    通过实现Runnable接口,使得该类有了多线程类的特征,run方法是多线程程序的一个执行目标,所有的多线程代码都写在run()方法中,Thread类实际上也是实现了Runnable接口的类

    在启动的多线程的时候,需要先通过Thread类的构造方法Thread(Runnable target),然后调用Thread类对象的start方法来运行多线程程序

    备注;Runnable对象仅仅作为Thread类对象的target,Runnable实现类中包含了run方法作为线程的执行体,而实际的线程对象依然是Thread类的实例

    线程安全

    如果有多个线程在同时的运行,而这些线程可能同时在运行这段代码.程序每次运行结果和单线运行的结果是一样的,而且其他的变量的值也和预期的值是一样的,就是线程安全的.

    通过发现,当多个线程取共享同一个资源的时候出现了线程的不安全的问题

    备注:线程安全问题一般都是有全局变量或者静态变量引起的.若每个线程中对全局变量.静态变量只有读操作.而无写的操作,这样的话,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程的同步,否则的话就很可能会引发线程的安全问题.

    线程同步

    当我们使用多线程访问同一资源的时候,且着多个线程中对资源有写的操作,就容易出现线程安全问题

    要解决多线程并发访问一个资源的安全问题,java中就提供了同步机制(synchronized)来解决.

    窗口1线程进入操作的时候,窗口2和窗口3线程只能在外面等待,窗口1线程操作结束.窗口1和窗口2和窗口3才有机会进入代码中去执行.也就是说某个线程修改共享资源的时候,其他线程不能修改共享资源,等待修改完毕同步后,才能取抢夺cpu的使用资源.完成对应的操作.保证了数据的同步性,解决了线程的不安全问题.

    有三部方式实现同步机制:

    1.同步代码块

    2.同步方法

    3.锁机制

    同步代码块
    • 同步代码块:synchroized关键字可以用于方法中的某个代码块中,表示只对这个代码块的资源实行互斥访问

    格式:

    synchronized(同步锁){
    //需要操作的同步代码.
    }

    同步锁

    同步锁是一个对象,是一个抽象的概念,可以想象成在对象上标记了一个锁.

    1. 锁对象可以是任意类型的,Object

    2. 2.多个线程对象,要使用同一把锁.

    注意:

    在任何时候,最多允许一个线程拥有同步锁(其实是把钥匙(对象监视器),),谁拿到同步锁谁就拥有资格进入代码中,其他线程只能在外面等待这.

    (Blocked阻塞状态)

    总结:同步中的线程没有执行完毕(从cpu出来),不会释放锁,其他线程在同步代码块外会一直等待前一个拥有锁的对象释放锁,程序会频繁的判断锁,获得锁,释放锁,程序的效率大大降低.

     

  • 相关阅读:
    php改写session到数据库
    mysql UNIX时间戳与日期的相互转换
    关于netbeans中的JComboBox(复选框)
    Java中数据类型转换
    趣味游戏___表示数
    C语言 约瑟夫圈问题:N个人围成一圈,从第一个人开始按顺序报数并编号1,2,3,……N,然后开始从第一个人转圈报数,凡是报到3的退出圈子。则剩下的最后一个人编号是多少。
    maven——使用阿里云镜像
    spring——整合Mybatis
    spring——AOP(静态代理、动态代理、AOP)
    spring——通过注解显式的完成自动装配
  • 原文地址:https://www.cnblogs.com/rosiness/p/14135503.html
Copyright © 2020-2023  润新知