java synchronized关键字以及对线程锁的理解

ArcGIS中地理坐标系与投影坐标系以及投影转换 简单介绍arcgis软件中坐标系定义、设置和常见问题。 阅读详情


参考了2篇文章: 

http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html

http://www.cnblogs.com/benshan/p/3551987.html 


Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。

一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。

三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。

四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。

五、以上规则对其它对象锁同样适用.



synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块。

1. synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如:
public synchronized void accessVal(int newVal);
synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能

执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行

状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有

一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)

。
在 Java 中,不光是类实例,每一个类也对应一把锁,这样我们也可将类的静态成员函数声明为 synchronized ,以控制其对类的静态成

员变量的访问。
synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,典型地,若将线程类的方法 run() 声明为

synchronized ,由于在线程的整个生命期内它一直在运行,因此将导致它对本类任何 synchronized 方法的调用都永远不会成功。当然我们可

以通过将访问类成员变量的代码放到专门的方法中,将其声明为 synchronized ,并在主方法中调用来解决这一问题,但是 Java 为我们提供

了更好的解决办法,那就是 synchronized 块。
2. synchronized 块:通过 synchronized关键字来声明synchronized 块。语法如下:
synchronized(syncObject) {
//允许访问控制的代码
}
synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机

制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。 

 
对synchronized(this)的一些理解
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线

程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized

(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)

同步代码块的访问将被阻塞。
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个

object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
五、以上规则对其它对象锁同样适用


VB摄像头监控 该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制 立即下载

相关推荐

Quartus Prime 软件 USB-blaster 驱动安装失败【已解决】

一、安装步骤 1、将FPGA 开发板插入电脑时,未安装驱动的电脑会提示安装usb-Blaster驱动。Windows搜索框打开设备管理器,在“其他设备”下会发现黄色感叹号的“USB-Blaster”的设备驱动。 2、Quartus系列软件的安装目录下自带USB-blaster的驱动程序,右键更新驱动,选择驱动目录:(D:\intelFPGA\18.1\quartus\drivers\usb-blaster,文件位置和版本请按照自己安装的路径选择),点击Next开始安装。 3、安装成功,重启电脑即可使

adolphwang_909086的博客 6万+

线程同步(解决线程安全问题)

不好,会影响其它无关线程的执行(比如说A和B用的是同一个账户,C和D用的是同意账户,使用任意对象进行加锁,在A对象取钱时候,不光会影响B,还会影响无关的C和D)为了更清晰的表达如何加锁和释放锁,JDK5以后提供了一个新的锁Lock,更加灵活,方便。把共享的资源进行上锁,每次只能一个线程进入访问完毕后解锁,然后其他线程才能进来。如果方法是实例方法,同步方法默认用this作为锁的对象。同步方法其实底层也是有隐式锁对象的,只是锁的范围是整个方法代码。多个线程同时执行,发现账户都是够钱的。......

学习笔记 342

基于PLC的全自动洗衣机控制系统+控制程序

本设计使用PLC控制系统替换了传统的继电器控制系统,实现了全自动洗衣机在硬件方面的提升,丰富了全自动洗衣机在软件方面的功能,提高了全自动洗衣机的洗衣效率,基本可以满足用户的洗衣需求。

zzzz114231的博客 8954

什么是线程锁和进程锁?什么是死锁,死锁产生的原因和解决锁的办法

线程锁:当多个线程几乎同时修改一个共享数据的时候,需要进行同步控制,线程同步能够保证多个线程安全的访问竞争资源(全局内容),最简单的同步机制就是使用互斥锁。 某个线程要更改共享数据时,先将其锁定,此时资源的状态为锁定状态,其他线程就能更改,直到该线程将资源状态改为非锁定状态,也就是释放资源,其他的线程才能再次锁定资源。互斥锁保证了每一次只有一个线程进入写入操作。从而保证了多线程下数据的安全性...

梓栋DREM 9509

SBM与超效率SBM模型实战:从原始面板数据到MATLAB高效实现

本文详细介绍了SBM模型与超效率SBM模型的核心原理,并提供了从原始面板数据预处理到MATLAB高效实现的完整实战指南。通过具体代码解析,帮助研究者掌握如何利用MATLAB进行数据标准化、模型构建、效率求解及结果可视化,从而精准评估决策单元的相对效率,尤其适用于在高效单元中进一步精细排名的场景。

weixin_29100399的博客 478

5款高性价比LDO芯片实测对比:从TPS7A4501到LM2940,哪款更适合你的项目?

本文通过实测对比了TPS7A4501、TPS72301、LM2937、LM2940等五款高性价比LDO芯片的核心性能。文章详细分析了跌落电压、输出噪声、静态电流及热性能等关键指标,并结合电池供电物联网节点、高精度数据采集等典型应用场景,提供了清晰的选型指南,帮助工程师根据项目需求选择最合适的LDO芯片。

weixin_29305337的博客 115

【面试】锁的概念,锁相关的关键字,Lock与synchronized区别

当锁对象第一次被线程请求时,JVM会记录锁对象的标志为偏向,并将这个线程的Thread ID记录在对象头的Mark Word中,以后,当这个线程再次请求锁时,只需要检查一下对象头中的Thread ID是否与当前线程ID一致即可获得锁,无需再去争用锁。这种锁的优点是效率高,缺点是需要处理数据一致性的问题。在并发编程中,经常会遇到多个线程访问同一个共享资源,这时候我们要保证数据的一致性,那么就要用到了锁的概念,给资源加上锁,拿到锁所有权的人才能够进行操作共享资源,没有拿到锁的线程需要等待,等锁的所有权放开。

Treasure_shen的博客 274

Unity ProBuilder(自己创建斜面、拐角)

ProBuilder基础实例

weixin_56537692的博客 1551

java中关于锁的关键字

java中关于锁的关键字有2个 , synchronized 和volatile。 synchronized 可以对方法和语句块进行修饰。从而实现同一时刻只有一个线程能够执行。 volatile可以对变量进行修饰。保证线程在每次使用变量的时候,都会读取变量修改后的最的值。 很多人都将volatile理解为和synchronized差不多的功能。然而,实际情况并不是这样。 volatile只能

秦超的学习笔记 3649

vTaskStartScheduler()详解

是启动 FreeRTOS 实时内核的“扳机”。在调用它之前,你只是创建了一些任务结构,但它们都处于“待命”状态,系统仍然在按传统的裸机前后台方式运行。调用这个函数后,FreeRTOS 内核会接管系统的控制权,开始根据优先级调度你创建的任务,多任务环境才真正开始。关键点:它没有参数。它的所有行为都由中的配置宏控制。它通常不会返回。一旦调用,除非没有任务可以运行(或者你显式地停止了调度器),否则程序流永远不会回到main()函数中调用它的下一行。是一个没有参数但行为由精密控制的函数。

Shylock_Mister的博客 1592

Mac mini M2 部署 OpenClaw:最稳 7×24 本地 AI 服务器

Mac mini M2 凭借其强大的 M2 芯片、低功耗和静音特性,成为部署 OpenClaw AI 服务器的理想平台。本文详细介绍了从系统配置到 OpenClaw 部署的全过程,包括 Docker 环境搭建、docker-compose 编排、性能优化方案以及开机自启设置。通过统一内存架构和高效 SSD,M2 版 Mac mini 在 AI 推理速度上显著优于前代产品,同时保持极低的功耗(仅 8W),适合 7×24 小时稳定运行。部署方案充分利用了容器化技术,确保了服务的可靠性和可维护性。

一键难忘的博客 2953

线程锁是什么?

线程锁(也称为互斥锁)是一种同步机制,用于保护共享资源或临界区,以防止多个线程同时访问或修改数据。线程锁实际上是锁住的是共享资源,而不是线程本身。当多个线程需要访问或修改共享资源时,线程锁可以确保只有一个线程可以进入临界区,其他线程需要等待。这样可以避免多个线程同时对共享资源进行读写操作,导致数据不一致或竞态条件的问题。线程锁的基本原理是,在进入临界区之前,线程会尝试获取锁。如果锁已经被其他线程占用,则当前线程会被阻塞,直到锁被释放。一旦线程成功获取到锁,它就可以进入临界区,执行对共享资源的操作。

Blue92120的博客 790

Flask基础项目:从零到一搭建用户管理系统

本文介绍了一个基于Flask的用户管理系统,具有完整的增删改查功能。系统采用SQLAlchemy ORM进行数据库操作,自动处理SQL注入并首次运行时创建表结构。主要特点包括:实时统计用户总数和平均年龄、智能即时搜索、前后端双重数据验证、邮箱唯一性检查、流畅动画效果和响应式设计。后端使用Flask框架实现RESTful API,前端采用现代化UI设计,支持异步操作不阻塞界面。系统安装简单,只需创建数据库并安装依赖即可运行,适合作为基础用户管理系统的参考实现。

数据知道的博客 3837

Java练习题 04

1. 下面关于volatile的功能说法正确的是哪个 正确答案: B C 你的答案: B C (正确) A.原子性 B.有序性 C.可见性 D.持久性 synchronized保证三大性,原子性,有序性,可见性,volatile保证有序性,可见性,不能保证原子性 volatile到底做了什么: 1.禁止了指令重排 2.保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量值,这个新值对其他线程是立即可见的 3.不保证原子性(线程不安全) synchronized关键字和volatile关键

weixin_46708745的博客 1248

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JAVA之线程并发

最近表示被各种并发情况搞的无比蛋疼又神伤,加之在搞socket通信这种中下层玩意,简直日渐憔悴。嗯不过每一次走得更高更远都是一个浪漫和内涵的故事,所以这次来把并发搞搞清楚   首先来说一个老生常谈的问题 并发并行的区别,然后再说说进程和线程的区别,已然看到无数学长学姐笔试面试碰到这种题   以下大多出自互联网,如有错误求大神指正   先来说并发并行 由于这篇文章转载太广。。。我着...

u014558368的博客 218

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

阿里笔试测评,这道多线程的题你如何解答?

世界上并没有完美的程序,但是我们并不因此而沮丧,因为写程序就是一个不断追求完美的过程。 问答1、 下面的代码在绝大部分时间内都运行得很正常,请问在什么情况下会出现问题?问题的根源在哪里? (必答-25%) import java.util.LinkedList; public class Stack { LinkedList list = new LinkedList(); public synchronized void push(Object x) .

我的博客 688

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java线程

多线程:多个程序并行运行而非串行运行 线程运行状态图: 一、实现线程的手段: 1.继承Thread类: 2.实现Runnable接口:

qq_51510549的博客 123

多线程知识整理归纳总结

多线程基础知识 1. 线程的使用 1.1 线程的实现方式 1> 继承Thread类 2>实现Runnable 3> 实现Callable接口 ​ Thread类本质是实现了Runnable接口的一个实例,代表一个线程的实例。 ​ 启动方式是通过Thread类的start()方法,start()方法是一个native方法,启动一个新线程,并执行run方法 ​ 方式1.继承Thread类 1> 定义一个类MyThread继承Thread类 2> 在MyThread类

qq_43661841的博客 254

15、线程(基础)

一、线程 1、概念介绍 2、单线程和多线程 3、并发和并行 二、线程基本使用 1、创建线程的两种方式 (1)案例1:继承 Thread 类 注:在多线程编程里面,不是main方法结束了,就意味着进程就结束了 //演示通过继承 Thread 类创建线程 public class Thread01 { public static void main(String[] args) throws InterruptedException {

yys0628的博客 516

【线程锁 Synchronized与ReentrantLock 示例】

前言: 之前一直对线程锁不理解,去网上找了很多讲解Synchronized关键字和ReentrantLock的帖子,大致了解了用法,写个小程序记录一下。有不足和错误欢迎留言评论,大家一起学习进步。 一、为什么要用线程锁 Java多线程同时处理任务会显著提高工作效率。但是,如果多个线程同时操作某一资源,可能会导致数据的不同步,引发错误。因此对于某些资源我们要对线程进行控制...

210

线程安全(一)synchronize什么是线程同步?什么是线程安全?什么是线程锁?synchronized怎么用?如何理解wait()和sleep()的区别?超详细例程讲解

一、什么是【线程同步】? 二、什么是线程锁? 2.1 没有加锁时 2.2 锁加在普通方法上时,使用同一个对象调用。 2.3 锁加在普通方法上时,使用两个不同的对象调用。 2.4 锁加在静态方法上时,使用两个不同的对象调用。 三、释放锁是什么样的?sleep()和wait()的区别? 3.1 测试类TestSleepWait 3.2 线程类OneThread 3.3 重点区别类,带锁的方法Person 解析 四、工程

T_Antry 1万+

Java_synchronized线程锁解释

synchronized概念方法理解 概念 1.synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A), 运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法(或者该类 的其他同步方法),有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完 这个方法后再运行此线程A,没有的话,锁定调用者,然后直接运行。它包括两种用法: ...

万事胜意 431

java中的synchronized关键字

synchronized的使用 synchronized方法: 语义: 如果A线程调用了某个实例对象的某个synchronized方法M,则A线程就获得了这个实例对象的锁,在A线程调用M方法结束之前(即A线程释放该实例对象的锁之前),其它线程不能调用该实例对象的任何synchronized方法和任何synchronized(this)同步代码块,因为其它线程无法获取到该实例对象的锁。 说明: 哪个线程先执行带synchronized关键字的方法,哪个线程就持有该方法所属对象的锁。 synchron

java小兵 917

java 线程锁的关键字_java线程总结3--synchronized关键字,原理以及相关的锁

在多线程编程中,synchronized关键字非常常见,当我们需要进行“同步”操作时,我们很多时候需要该该关键字对代码块或者方法进行锁定。被synchronized锁定的代码块,只能同时有一条线程访问该代码块。上面是很多人的认识,当然也是我之前对synchronized关键字的浅显认识,其实上面的观点存在一定的偏差。在参考了很多文章以及自己动手测试过相关代码后,我觉得有必要记录下自己对synchr...

weixin_39994270的博客 180

由浅深入理解java多线程,java并发,synchronized实现原理及线程锁机制

由浅深入理解java多线程,java并发,synchronized实现原理及线程锁机制 文章目录由浅深入理解java多线程,java并发,synchronized实现原理及线程锁机制一,线程的生命周期二,线程的调度调整线程优先级线程睡眠线程等待线程让步线程加入线程唤醒三,创建多线程的方式1,通过实现Runnable接口2,通过继承Thread类四,多线程间的数据共享1,Runnable接口实现多线程的数据共享2,Thread类实现多线程的数据共享五,synchronized实现多线程数据共享1,修饰实例方法

lgx211 907

Java【多线程】synchronized关键字

synchronized关键字-监视器锁monitor locker。

zrwcnm的博客 964
上一篇: 【leetcode】Two Sum(medium)
下一篇: Java中普通代码块,构造代码块,静态代码块区别及代码示例
eclipse_c
博客等级 码龄14年 28粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值