java学习之高级语法(十六)----- 线程安全

简介: java学习之高级语法(十六)----- 线程安全

 ▶  线程安全问题的产生

image.gif编辑

产生安全问题的前提:只有当多个线程访问了共享的数据时才有可能产生线程安全问题

代码实现上面卖票过程:

image.gif编辑

image.gif编辑

想要提高安全问题出现的概率,让程序睡眠:

image.gif编辑

image.gif编辑

▶  解决线程安全问题 ----- 线程同步

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

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

有三种方式完成同步操作:

1. 同步代码块

        格式:   synchronized( 锁对象 ) {

                             可能会出现线程安全问题的代码(访问了共享数据的代码)

                      }

        注意: (1)同步代码块中的锁对象可以使用任意的对象

                   (2)但是必须保证多个线程使用的锁对象是同一个

                   (3)锁对象的作用:把同步代码块锁住,只让一个线程在同步代码块中执行

image.gif编辑

2. 同步方法

   格式:就是定义方法的格式,只不过要加上关键字 synchronized

              修饰符  synchronized  返回值类型  方法名( 参数列表 ){

                      可能会出现线程安全问题的代码( 访问了共享数据的代码 )

               }

    使用步骤:(1)把访问了共享数据的代码抽取出来,放到一个方法中

                      (2)在方法上添加 synchronized 修饰符

    定义一个同步方法,同步方法也会把方法内部的代码锁住,只让一个线程执行。

    同步方法的锁对象是谁?就是实现类对象 new RunnableImpl(),也就是 this 。

    静态同步方法: 就是在同步方法的基础上加上关键字 “ static ”

    静态同步方法的锁对象是谁? 不能是 this ,this 是创建对象后产生的,静态方法优于对象,静态方法的锁对象是本类的class属性 ---> class文件对象(反射)

3. 锁机制

java.util.concurrent.locks.Lock接口

Lock 实现提供了比使用 synchronized 方法和语句可获得的更广泛的锁定操作

Lock接口中的方法:    void  lock()  --- 可获取锁

                                    void  unlock() --- 释放锁

java.util.concurrent.locks.ReentrantLock implements Lock接口

使用步骤:(1)在成员位置创建一个 ReentrantLock 对象

                 (2)在可能会出现安全问题的代码前调用 Lock 接口中的方法 lock 获取锁

                 (3)在可能会出现安全问题的代码后调用 Lock 接口中的方法 unlock 释放锁

相关文章
|
12天前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
69 14
|
15天前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
46 13
|
15天前
|
安全 Java 开发者
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。
|
1月前
|
Java 调度 开发者
Java线程池ExecutorService学习和使用
通过学习和使用Java中的 `ExecutorService`,可以显著提升并发编程的效率和代码的可维护性。合理配置线程池参数,结合实际应用场景,可以实现高效、可靠的并发处理。希望本文提供的示例和思路能够帮助开发者深入理解并应用 `ExecutorService`,实现更高效的并发程序。
36 10
|
1月前
|
Java 数据库连接 数据库
【潜意识Java】深度分析黑马项目《苍穹外卖》在Java学习中的重要性
《苍穹外卖》项目对Java学习至关重要。它涵盖了用户管理、商品查询、订单处理等模块,涉及Spring Boot、MyBatis、Redis等技术栈。
118 4
|
1月前
|
前端开发 Java 数据库连接
【潜意识Java】深度解读JavaWeb开发在Java学习中的重要性
深度解读JavaWeb开发在Java学习中的重要性
38 4
|
1月前
|
存储 移动开发 算法
【潜意识Java】Java基础教程:从零开始的学习之旅
本文介绍了 Java 编程语言的基础知识,涵盖从简介、程序结构到面向对象编程的核心概念。首先,Java 是一种高级、跨平台的面向对象语言,支持“一次编写,到处运行”。接着,文章详细讲解了 Java 程序的基本结构,包括包声明、导入语句、类声明和 main 方法。随后,深入探讨了基础语法,如数据类型、变量、控制结构、方法和数组。此外,还介绍了面向对象编程的关键概念,例如类与对象、继承和多态。最后,针对常见的编程错误提供了调试技巧,并总结了学习 Java 的重要性和方法。适合初学者逐步掌握 Java 编程。
56 1
|
1月前
|
缓存 安全 算法
Java 多线程 面试题
Java 多线程 相关基础面试题
|
9月前
|
安全 Java
java保证线程安全关于锁处理的理解
了解Java中确保线程安全的锁机制:1)全局synchronized方法实现单例模式;2)对Vector/Collections.SynchronizedList/CopyOnWriteArrayList的部分操作加锁;3)ConcurrentHashMap的锁分段技术;4)使用读写锁;5)无锁或低冲突策略,如Disruptor队列。
60 2
|
9月前
|
存储 安全 Java
深入理解Java并发编程:线程安全与锁机制
【5月更文挑战第31天】在Java并发编程中,线程安全和锁机制是两个核心概念。本文将深入探讨这两个概念,包括它们的定义、实现方式以及在实际开发中的应用。通过对线程安全和锁机制的深入理解,可以帮助我们更好地解决并发编程中的问题,提高程序的性能和稳定性。

热门文章

最新文章