线程(二)——线程安全与线程同步

2023-10-27

        上一篇线程(一)——线程基础中介绍了一些线程相关的基础知识,比如:线程的定义、线程的使用方法、线程的状态、并发和并行的概念等。说道并发呢,我们自然就会想到线程安全这个问题了,这一篇就讲一讲什么是线程安全,以及如何保证线程安全的。


一、什么是线程安全

        线程安全指的是在多个线程并发访问一个数据源时,不会出现数据不一致的情况或者数据污染。线程不安全就是,有可能多个线程先后更改数据造成所得到的的数据是脏数据的情况。

        比如,票务系统,由于买票的人太多,单线程处理的话效率太慢,所以需要多线程处理。如果系统不是数据安全的就可能出现一票多卖的情况。一张票通过线程A卖出去后,由于数据不同步,紧接着线程B又把这张票卖了一次,甚至还会有其它线程也卖过这张票。到时就会出现N个人拿着同一个座位票的情况。

       那么,如何保证线程安全呢?方法是使用synchronized同步机制同步锁机制(也叫做Lock同步机制)。在本文中只介绍synchronized同步机制。

 

二、synchronized同步机制。

        synchronized是一个修饰词,它可以修饰方法和代码块。被synchronized修饰的方法和代码块分别叫做同步方法和同步代码块。同步方法和同步代码块同一时刻只能由一个线程执行。只有等这个线程执行完了这个同步方法或者同步代码块,其它线程才有机会获得锁,并执行同步方法和同步代码块。注意:这个锁和同步锁机制中的同步锁不是一个概念,等下会详细说明。

        学习synchronized同步机制需要先了解几个关键概念:

1、同步方法

同步方法指的是被synchronized修饰词修饰的方法,可以是静态方法也可以是非静态方法,如下:

//静态同步方法

public synchronized static method1() {}

//非静态同步方法

public synchronized method2() {}

2、同步代码块

同步代码块指的是被synchronized修饰词修饰的一段代码,如下:

                 public void method() {
			……
			synchronized(this/Test.class) {
			
			}
		}

         synchronized修改关键字修饰代码块的时候后面会有一个括号,扩号里面用来指明锁,只有拿到这个锁的线程才能进入到同步代码块并执行这些同步代码。这个锁可以是一个实例对象也可以是一个类的class对象。前者我们成为对象锁,后者称为类锁。

 

 3、锁

首先说明一下这个锁和上面提到的同步锁机制中的同步锁不是一个概念。这里的锁准确的说应该叫做monitor,java源码中的注释就是称作monitor的,不知道为什么被叫成了锁。可能是因为一个线程获取了这个monitor后,其它的线程都无法进入到同步方法和同步代码块里面,monitor的作用与锁很类似,所以就称作锁吧。

        java中规定,每个对象都有独有的一个monitor。而一个类除了拥有普通的实例对象外,还有一个特殊的对象,那就是Class对象。我们知道一个类只有一个Class对象,Object中关于getClass()方法的注释如下:

		    /**
		     * Returns the runtime class of this {@code Object}. The returned
		     * {@code Class} object is the object that is locked by {@code
		     * static synchronized} methods of the represented class.
		     * ......
		     */
		    public final Class<?> getClass() {
		      return shadow$_klass_;
		    }

出于Class

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

线程(二)——线程安全与线程同步 的相关文章

  • android的消息处理机制(图+源码分析)——Looper,Handler,Message

    http www cnblogs com codingmyworld archive 2011 09 14 2174255 html
  • 关于 volatile——可见性,有序性,内存屏障

    并发编程的三大特性 原子性 有序性 可见性 从这三个方面去看一下 volatile volatile 保证了可见性 public class Demo1 private boolean flag true public void test
  • C# Task异步编程

    Task任务用法 Task用的是线程池 线程池的线程数量的有上限的 这个可以通过ThreadPool修改 我们经常会用到task run new task 和task factory startnew方法来创建任务 Task Factory
  • CPU密集型和IO密集型任务的权衡:如何找到最佳平衡点

    关于作者 CSDN内容合伙人 技术专家 从零开始做日活千万级APP 专注于分享各领域原创系列文章 擅长java后端 移动开发 人工智能等 希望大家多多支持 目录 一 导读 二 概览 三 CPU密集型与IO密集型 3 1 CPU密集型 3 2
  • 运行.exe,并自动关闭.exe

    运行exe文件 进行计算 并一次计算完毕后自动关闭exe界面 结束线程 可用于循环启动 exe param rnRuntime public static void test3 Runtime rnRuntime try 如果想自动关闭 r
  • 线程的属性 —— 分离的状态(detached state)、栈地址(stack address)、栈大小(stack size)

    参考 四十二 线程 线程属性 作者 FadeFarAway 发布时间 2017 01 17 14 09 55 网址 https blog csdn net FadeFarAway article details 54576771 目录 引入
  • java 用redis如何处理电商平台,秒杀、抢购超卖

    原地址 http blog csdn net u012116196 article details 51782934 一 刚来公司时间不长 看到公司原来的同事写了这样一段代码 下面贴出来 1 这是在一个方法调用下面代码的部分 java vi
  • 多任务

    多任务 1 多任务的概念 多任务的最大好处是充分利用CPU资源 提高程序的执行效率 多任务是指在同一时间内执行多个任务 例如 现在电脑安装的操作系统都是多任务操作系统 可以同时运行着多个软件 多任务的执行方式 并发 并行 是多个任务真正意义
  • java并发库之Executors常用的创建ExecutorService的几个方法说明

    一 线程池的创建 我们可以通过ThreadPoolExecutor来创建一个线程池 new ThreadPoolExecutor corePoolSize maximumPoolSize keepAliveTime milliseconds
  • 多线程—7种同步方法

    多线程 7种同步方法 原文https www cnblogs com cxxjohnson p 8536257 html h3 关于线程同步 7种方式 同步方法 同步代码块 使用重入锁实现线程同步 ReentrantLock 使用特殊域变量
  • 多线程编程技巧

    java中 多线程类需要继承Thread或实现Runnable接口 在Run函数中执行多线程代码 但是需要用Start 函数开始执行 多线程并行执行 执行的顺序取决于本地操作系统给谁分配系统资源 Runnable共享资源的方法 a 如果每个
  • QT多线程(QThread)小结

    QThread只有run函数是在新线程里的 其他所有函数都在QThread生成的线程里 如果QThread是在ui所在的线程里生成 那么QThread的其他非run函数都是和ui线程一样的 所以 QThread的继承类的其他函数尽量别要有太
  • 开发中遇到的线程不安全问题小结

    1 SimpleDateFormat 是线程不安全的 推荐使用如下 1 声明SimpleDateFormat变量时 加synchronized修饰 2 使用DateUtils 工具类 3 使用ThreadLocal 如下 private s
  • linux创建线程失败errno=11

    问 题 为什么一个进程调用pthread create来创建线程 当251次就失败了 失败errno11 Resource temporarily unavailable 原 因 一个进程最多拥有250个线程资源 由于pthread cre
  • Linux的进程管理

    目录 1 概述 2 进程描述符 2 1 进程描述符的分配 2 2 进程描述符的存放 2 3 进程状态 2 4 进程上下文 2 5 进程家族树 3 进程的创建 4 进程的终结 5 线程的实现 1 概述 进程是执行期的代码 但是进程不止包括这样
  • 代码运行时 CPU占用率100%的解决方法

    原因 建立连接后启动新的线程 如果线程中有简单粗暴的不含阻塞的while 1 循环 会持续占用CPU 导致CPU占用率极高 解决 在while 1 的大循环中插入一句sleep 1 即阻塞1毫秒 java线程内则使用Thread sleep
  • jemalloc原理分析

    jemalloc原理分析 转载自http club alibabatech org article detail htm articleId 36 首先介绍一下jemalloc中的几个核心概念 1 arena jemalloc的核心分配管理
  • 进程,线程,协程总结

    进程 三种状态 就绪态 运行的条件都已经慢去 正在等在cpu执行 执行态 cpu正在执行其功能 等待态 等待某些 条件满足 例如一个程序sleep了 此时就处于等待态 生命周期 用户编写代码 代码本身是以进程运行的 启动程序 进入进程 就绪
  • 关于tomcat繁忙线程数获取

    在某些情况下 我们需要对tomcat的繁忙线程数进行监控以满足我们队应用服务器状态信息的把控 那么我们该如何通过我们自定义的接口来获得tomcat的繁忙线程数 首先 我们应该想到tomcat本身是否为我们提供了类似的方法 博主在实际开发中拜
  • 进程和线程的详解和区别

    1 进程和线程概述 我们都知道计算机的核心是CPU 它承担了所有的计算任务 而操作系统是计算机的管理者 它负责任务的调度 资源的分配和管理 统领整个计算机硬件 应用程序是具有某种功能的程序 程序是运行于操作系统之上的 2 进程 我们编写的代

随机推荐