JAVA 多线程,安全锁总结

简介: JAVA 多线程,安全锁总结

1、多线程应用场景:

       ①需要同时执行最少两个以上任务。

       ②程序需要有等待任务,例如:文件读写,网络操作,搜索。

       ③后台运行程序。

2、多线程程序的优点:

       ①提高程序的响应,对图形化界面更有意义,可增强用户体验。

       ②提高系统CPU的利用率

       ③改善程序结构。将又长又复杂的进程分为多个线程,独立运行,便于修改和处理。

3、创建多线程方式一:Thread

       ①创建一个继承Thread的子类

       ②重写Thread类的run方法

       ③创建Thread类的子类对象

       ④通过此对象调用start()

4、Thread常用方法:

       ①currentThread():静态方法,返回执行当前代码的线程

       ②start():启动当前线程,调用当前线程的run()

       ③run():通常需要重写Thread类中的此方法,将创建的线程要执行的操作声明在此方法中

       ④getName():获取当前的线程名Thread.currentThread().getName()

       ⑤setName():设置当前的线程名

       ⑥yield():释放当前CPU的执行权限

       ⑦join():在线程a中调用线程b的join(),此时线程a进入阻塞状态,直到线程b完全执行完以后,线程a才结束阻塞状态。

       ⑧sleep(long millitime):当前线程进入“睡眠”的millitime毫秒,在millitime毫秒时间内,线程是阻塞状态。

       ⑨isAlive():判定当前线程状态是否存活

5、Tread优先级:

       ①MAX_PRIORITY 线程最高是10

       ②MIN_PRIORITY 线程最低是1

       ③NORM_PRIORITY 默认是5

       ④getPriority 获取线程优先级数

       ⑤setPriority 设置线程有限级数

           说明:优先级高可以抢占有限级低的线程CPU执行权,但是并不是先执行完优先级高的在执行优先级低的线程,概率高而已

6、创建多线程方式二:Runnable接口

       ①创建一个实现Runnable接口类

       ②实现类去实现Runnable中的抽象run()方法

       ③创建实现类的对象

       ④将此对象作为参数传递到Thread类的构造器中,创建Thread类的对象

       ⑤通过Thread类的对象调用start()方法

7、比较两种多线程创建方式:开发中优先选择Runnable接口方式

       原因:①实现的方式没有类的单继承性局限性

                  ②实现的方式更适合来处理多线程共享数据情况

       联系:public class Thread implements Runnable

       相同点:两种方式都需要重写run(),将线程要执行的逻辑声明在run()中

8、生命周期:

       ①新建:当一个Thread类或其子类的对象被声明并创建时,新生的线程对象处于新建状态

       ②就绪:处于新建状态的线程被start()方法后,将进入线程队列等待CPU时间片,此时它已经具备运行条件,只是没有分配到CPU资源

       ③运行:当就绪的线程被被调度并分配CPU资源时,便进入运行状态,run()方法定义了线程的操作和功能

       ④阻塞:在某种情况下,被人为挂起或执行输入输出操作时,让出CPU并临时终止自己的执行,进入阻塞状态

       ⑤死亡:线程完成了它的全部工作或线程被提前强制性地中止或出现异常导致

9、多线程安全:

       方式一:同步代码块

synchronized(同步监视器){
            //需要同步的代码
        }

          说明:①操作同步数据的代码,即为需要被同步的代码

             ②共享数据:多个线程共同操作的变量。

             ③同步监视器,俗称:锁,任何一个类的对象,都可以充当锁。

               要求:多个线程必须使用同一把锁。

               补充:在实现Runnable接口创建多线程时,可以考虑用this充当同步监视器

       方式二:同步方法

       非静态同步方法:

private synchronized void run(){
            //需要同步的代码
        }

       静态同步方法:

private static synchronized void run(){
            //需要同步的代码
        }

       说明:

           ①同步方法仍然设计到同步监视器,有默认方法,不用显示声明

           ②非静态方法同步监视器是:this

               静态方法同步监视器是:当前类本身

       好处:同步的方式解决了线程的安全问题

       缺陷:操作代码时,只能有一个线程参与,其它线程等待。相当于是一个单线程的过程,效率低

       方式三:lock锁  --JDK5.0新增

ReentrantLock r = new ReentrantLock();
        r.lock();  //加锁
        //线程安全区代码
        r.unlock(); //解锁

10、多线程死锁:

       死锁:不同的线程分别占用对方需要的资源不放弃,都在等待对方放弃自己需要的资源,形成了线程的死锁

       解决方法:

           ①专门的算法、原则

           ②尽量减少同步资源的定义

           ③尽量避免嵌套同步

11、线程通信:

       三个方法:

           wait():执行此方法,线程进入阻塞状态,并释放同步监视器

           notify():执行此方法,唤醒wait()的一个线程;如果有多个线程唤醒优先级最高的,优先级一样随机唤醒

           notifyall():执行此方法,唤醒wait()所有线程

       说明:三个方法必须使用在同步代码块或同步方法中

             三个方法的调用者必须是同步代码块或同步方法中的同步监视器,否则会出现异常

             三个方法定义在Java.long.Object类中

12、创建多线程方式三:实现Callable接口

       创建步骤:①创建一个实现Callable的实现类

                 ②实现call()方法,将此线程需要执行的操作声明在call()中

                 ③创建callable接口实现类的对象

                 ④将此callable接口实现类的对象作为传递到FutureTask

                 ⑤将FutureTask的对象作为参数传递到Thread类的构造器中,创建Thread对象,并调用start()

                 ⑥获取callable中call方法的返回值

13、创建多线程方式四:使用线程池

       好处:①提高响应速度(减少创建线程的时间)

             ②降低资源消耗(重复利用线程,不需要每次重新创建)

             ③便于线程管理


相关文章
|
1天前
|
缓存 Java
【Java基础】简说多线程(上)
【Java基础】简说多线程(上)
5 0
|
1天前
|
并行计算 算法 安全
Java从入门到精通:2.1.3深入学习Java核心技术——掌握Java多线程编程
Java从入门到精通:2.1.3深入学习Java核心技术——掌握Java多线程编程
|
1天前
|
安全 Java 编译器
是时候来唠一唠synchronized关键字了,Java多线程的必问考点!
本文简要介绍了Java中的`synchronized`关键字,它是用于保证多线程环境下的同步,解决原子性、可见性和顺序性问题。从JDK1.6开始,synchronized进行了优化,性能得到提升,现在仍可在项目中使用。synchronized有三种用法:修饰实例方法、静态方法和代码块。文章还讨论了synchronized修饰代码块的锁对象、静态与非静态方法调用的互斥性,以及构造方法不能被同步修饰。此外,通过反汇编展示了`synchronized`在方法和代码块上的底层实现,涉及ObjectMonitor和monitorenter/monitorexit指令。
10 0
|
1天前
|
监控 安全 Java
在Java中如何优雅的停止一个线程?可别再用Thread.stop()了!
在Java中如何优雅的停止一个线程?可别再用Thread.stop()了!
7 2
|
1天前
|
Java 调度
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
17 1
|
1天前
|
安全 Java
Java基础教程(15)-多线程基础
【4月更文挑战第15天】Java内置多线程支持,通过Thread类或Runnable接口实现。线程状态包括New、Runnable、Blocked、Waiting、Timed Waiting和Terminated。启动线程调用start(),中断线程用interrupt(),同步用synchronized关键字。线程安全包如java.util.concurrent提供并发集合和原子操作。线程池如ExecutorService简化任务管理,Callable接口允许返回值,Future配合获取异步结果。Java 8引入CompletableFuture支持回调。
|
2天前
|
安全 Java 调度
Java线程:深入理解与实战应用
Java线程:深入理解与实战应用
19 0
|
2天前
|
Java
Java中的并发编程:理解和应用线程池
【4月更文挑战第23天】在现代的Java应用程序中,性能和资源的有效利用已经成为了一个重要的考量因素。并发编程是提高应用程序性能的关键手段之一,而线程池则是实现高效并发的重要工具。本文将深入探讨Java中的线程池,包括其基本原理、优势、以及如何在实际开发中有效地使用线程池。我们将通过实例和代码片段,帮助读者理解线程池的概念,并学习如何在Java应用中合理地使用线程池。
|
6天前
|
安全 Java
深入理解 Java 多线程和并发工具类
【4月更文挑战第19天】本文探讨了Java多线程和并发工具类在实现高性能应用程序中的关键作用。通过继承`Thread`或实现`Runnable`创建线程,利用`Executors`管理线程池,以及使用`Semaphore`、`CountDownLatch`和`CyclicBarrier`进行线程同步。保证线程安全、实现线程协作和性能调优(如设置线程池大小、避免不必要同步)是重要环节。理解并恰当运用这些工具能提升程序效率和可靠性。
|
7天前
|
安全 Java
java多线程(一)(火车售票)
java多线程(一)(火车售票)