并发编程:线程同步基础:2、方法同步

并发编程-多线程基础点总结 本文对多线程编程的部分知识点进行总结,从理论知识开始,到为什么要使用多线程,进程和线程的区别,Java中如何创建线程等,以及线程的一些基础操作,本文涵盖多线程的部分基础,建议收藏,多次温习,夯实基础。 阅读详情

目录

案例说明

一、主程序

二、执行结果

三、总结


案例说明

验证三种同步方式的独立性:

  1. 静态synchronized -> 类对象
  2. synchronized -> 实例对象(this)
  3. synchronized块 -> 参数对象

一、主程序

package xyz.jangle.thread.test.n2_2.synchonized;

import java.util.concurrent.TimeUnit;

/**
 * 
 *  同步方法,临界区同步的三种方式。
 *   从运行结果中可以看出,三种方式互不干扰,也说明他们不是互斥的,是不同的加锁方式。
 * @author jangle
 * @email jangle@jangle.xyz
 * @time 2021年1月28日 上午10:27:48
 * 
 */
public class M {

    private static final Object lock = new Object();

	public static void main(String[] args) {
		// 创建3个线程执行3个不同的方法。
		M m = new M();
		new Thread(() -> {
			m.test1();
		}).start();
		new Thread(() -> {
			M.test2();
		}).start();
		new Thread(() -> {
			m.test3();
		}).start();

	}

	/**
	 * 关联实例对象,即this,作为锁对象
	 * 
	 * @author jangle
	 * @time 2021年1月28日 上午10:34:36
	 */
	public synchronized void test1() {
		for (int i = 0; i < 10; i++) {
			try {
				TimeUnit.SECONDS.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("111111111111");
		}
	}

	/**
	 * 关联类对象,即Class对象,作为锁对象
	 * 
	 * @author jangle
	 * @time 2021年1月28日 上午10:36:49
	 */
	public static synchronized void test2() {
		for (int i = 0; i < 10; i++) {
			try {
				TimeUnit.SECONDS.sleep(1);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("2222222222222");
		}

	}

	/**
	 * 关联参数对象,即new Object(),作为锁对象
	 * 
	 * @author jangle
	 * @time 2021年1月28日 上午10:37:11
	 */
	public void test3() {
		synchronized (lock) {

			for (int i = 0; i < 10; i++) {
				try {
					TimeUnit.SECONDS.sleep(1);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				System.out.println("33333333333");
			}
		}
	}

}

二、执行结果

111111111111
33333333333
2222222222222
111111111111
33333333333
2222222222222
111111111111
2222222222222
33333333333
111111111111
2222222222222
33333333333
111111111111
33333333333
2222222222222
111111111111
33333333333
2222222222222
111111111111
2222222222222
33333333333
111111111111
33333333333
2222222222222
111111111111
33333333333
2222222222222
111111111111
33333333333
2222222222222

三、总结

从运行结果中可以看出,三种方式互不干扰,也说明他们不是互斥的,是不同的加锁方式。

python并发编程之线程同步 在并发编程中,线程同步是一种重要的机制,用于确保多个线程之间的正确性和一致性。Python提供了几种线程同步的机制,包括锁、条件变量和信号量。下面我们将介绍这些机制,并列举10个实用的场景代码。 阅读详情

相关推荐

并发编程和多线程

文章目录并发编程和串行并发编程的目的:适合并发编程的场景并发编程的挑战之--频繁的上下文切换并发编程的挑战之--死锁并发编程的挑战--线程安全并发编程的挑战--资源的限制线程基础线程和进程的区别线程的状态及相互转换线程创建线程的挂起和恢复操作线程的中断操作(interrupt)线程的优先级守护线程 并发编程和串行 并发编程的目的: 让程序充分利用非计算机资源·、 加快程序响应速度(耗时任务、we...

why36910的博客 1203

深入浅出Java并发编程:线程基础

通过本文的学习,我们详细探讨了Java并发编程中的线程基础,包括进程与线程的区别、线程的创建方式线程的生命周期守护线程与用户线程、以及线程优先级与调度策略。掌握这些基础知识是进一步学习并发编程的关键。在实际开发中,理解并正确使用这些概念可以帮助我们构建高效、稳定的多线程应用。然而,并发编程的复杂性远不止于此,后续我们还将深入探讨线程安全、锁机制、线程通信等高级主题。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 1933

【强化学习】常用算法之一 “A3C”

A3C(Asynchronous Advantage Actor-Critic)算法是一种在强化学习领域中应用广泛的算法,它结合了策略梯度方法和价值函数的学习,用于近似解决马尔可夫决策过程(Markov Decision Process)问题。A3C算法在近年来备受关注,因为它在处理大规模连续动作空间和高维状态空间方面具有出色的性能。A3C算法是一种基于策略梯度的强化学习算法,通过多个并行的智能体异步地与环境交互,并利用Actor和Critic网络实现策略和价值的近似,从而实现快速而稳定的强化学习训练。

Code_and516的博客 6756

C++并发编程:多线程与同步的艺术

本文介绍了C++并发编程的核心概念与技术,包括线程创建与管理、同步机制(互斥锁、条件变量、原子操作)以及标准库组件。通过代码示例展示了线程的基本使用、属性设置、互斥锁保护共享数据、条件变量实现线程协调、原子操作保证数据一致性,以及异步任务处理。这些技术帮助开发者构建高效且线程安全的并发程序,充分利用多核处理器性能。文章强调培养并发思维的重要性,为处理现代计算中的并行任务提供了实用解决方案。

编程世界如山海,探索不止。 1万+

避开期货指标常见坑:文华财经赢顺DK多空指标优化配置指南(附参数调试技巧)

本文详细解析了文华财经赢顺DK多空指标的优化配置方法,帮助交易者避开常见使用误区。通过参数个性化适配、动态调整趋势阈值和过滤假信号的三重验证,提升指标在期货交易中的准确性。附有参数调试技巧和不同市况下的配置建议,适合中高级交易者参考。

weixin_29063979的博客 433

Isaac Sim 车辆动力学:从参数调优到户外仿真的挑战与实战

本文深入探讨了Isaac Sim在车辆动力学仿真中的应用,从参数调优到户外场景模拟的实战经验。详细解析了悬架系统、轮胎物理模型等核心参数的设置技巧,并分享了应对户外仿真挑战的实用方案。通过Vehicle Wizard高级使用和传感器配置,帮助开发者高效完成车辆仿真与算法开发。

weixin_29192211的博客 403

C++并发编程:线程与同步的艺术

本文介绍了C++并发编程的核心概念与实践方法。主要内容包括:线程的创建与管理(基本使用、属性设置、错误处理);互斥锁的应用(基本使用、死锁预防);以及条件变量的同步机制。通过代码示例演示了如何实现线程间的安全通信与资源同步,帮助开发者掌握高效、安全的多线程编程技术。文章涵盖了从基础概念到实际应用的全过程,适合希望提升并发编程能力的C++开发者学习参考。

编程世界如山海,探索不止。 2万+

[从零开始学习FPGA编程-18]:快速入门篇 - 操作步骤2-6- VerilogHDL时序电路语法分析(以计数器为例)

目录前言:第1章 功能模块代码:counter.v第2章 驱动代码:tcounter.v前文以及阐述了VerilogHDL基本语法,本文将以modelsim自带的计数器程序来解读VerilogHDL的语法。代码路径:

文火冰糖(王文兵)的博客 7万+

Java并发编程:理解线程、同步和锁

Java提供了一套完备的并发编程工具,从基本的线程控制到复杂的锁机制和并发集合,这些工具帮助开发者构建稳健的多线程应用程序。原子类提供的主要优势是无锁的线程安全性,这通常比使用锁或其他同步机制具有更高的性能,特别是在高竞争的环境中。在Java并发编程中,除了锁和同步方法,条件变量和阻塞队列也是重要的工具,用于在多线程环境中协调线程之间的操作。阻塞队列是支持两个附加操作的队列,这些操作包括在队列为空时队列的获取操作将阻塞,等待队列变为非空,当队列满时插入操作将阻塞,等待队列可用。

宋小黑的博客 1566

yolov26改进 | Neck/颈部创新篇 | 独创HFPN利用分层特征融合块HFFB模块融合多层次特征改进yolov26(全网独家创新)

本文提出了一种创新的分层特征融合模块HFFB(Hierarchical Feature Fusion Block)来改进YOLOv26的neck部分,构建了名为HFPN的新型特征金字塔网络。该模块通过三分支结构融合局部特征(CNN提取)、全局特征(Swin Transformer提取)和中间特征,并包含空间注意力(SA)、通道注意力(CA)和残差反向MLP(IRMLP)等组件来优化特征融合效果。实验表明,该方法能针对不同尺度目标(大/中/小)进行自适应检测,可根据具体数据集需求选择不同配置。文章详细提供了核

Snu77的博客 479

【系统架构设计师】论文模板样例:论软件系统架构风格

本人于年月参与项目,该系统为*,在该项目组中我担任系统架构师岗位,主要负责系统整体架构设计。本文以该车联网项目为例,主要讨论了软件架构风格在该项目中的具体应用。底层架构风格我们采用了虚拟机风格中的解释器,因该公交共有几十种不同的数据协议,使用解释器风格可以满足整车数据协议兼容性需求;中间层关于应用层的数据流转采用了独立构件风格中的隐式调用,以减低系统间耦合度、简化软件架构,提高可修改性方面的架构属性;应用系统层采用了B/S的架构风格,统一解决公交行业性难题“实施推广难、维护难”问题。

数据知道的博客 9924

并发编程基础:从线程到进程的Python实践

在现代编程中,并发编程是一项不可或缺的技能。无论是为了提升程序的运行效率,还是充分利用多核处理器的性能,掌握并发编程都能让你的代码更上一层楼。Python 提供了强大的工具,如threading和模块,让开发者能够轻松实现多线程和多进程编程。本文将围绕并发编程基础展开,从线程与进程的概念入手,逐步深入到如何在 Python 中使用threading模块实现多线程,以及使用模块实现多进程。文章将通过通俗易懂的语言、清晰的代码示例和实际应用场景,帮助初学者快速入门,同时为进阶读者提供实用的技术参考。

吴师兄大模型的博客 1284

音视频开发基础(1):模拟视频技术简介

模拟视频技术是指用模拟技术对动态影像进行捕捉、记来、处理、存储、传输、复现的技术.模拟视频技术的发明、发展与模拟电视系统的发展密不可分.下面将通过模拟电视系统来介绍模拟视频技术中的基本概念. 首先,人的视觉系统的特征为电视等視稿系铳的发明、发展提供了理论依据.光线通过角膜、腫孔、晶状体的折射光线.透过玻璃体到达视网展.视网膜上分布着光感受器,光感受器在光线的剌激下...

琅嬛福地 1492

Java 并发编程:使用 Lock 和 Condition 实现线程同步

Lock和Condition接口是 Java 并发编程中非常重要的工具,它们为开发者提供了比synchronized更灵活、更强大的同步机制。通过合理使用Lock和Condition,可以实现复杂的同步控制、高效的线程间通信,从而提升程序的性能和稳定性。在实际开发中,应根据具体的业务场景和需求,选择合适的同步方式。同时,在使用Lock和Condition时,要注意正确地获取和释放锁,避免出现死锁等问题。随着 Java 版本的不断更新,并发编程的工具和技术也在不断发展和完善。

数字魔方操控师的博客 1149

SerDes学习笔记:均衡技术详解 01

本文系统阐述了高速SerDes链路中均衡技术的应用原理与实现方法。重点介绍了发射端预加重/FIR均衡和接收端CTLE/DFE/FFE等主流均衡方案,详细探讨了各类均衡器的频域特性、时域效果及硬件实现架构。

一只豌豆象的博客 1291

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【并发编程基础2】线程的状态

术语英文单词描述内存屏障是一组处理器指令,用于实现对内存操作的顺序限制缓冲行cache line缓存中可以分配的最小存储单位。处理器填写缓存线时会加载整个缓存线,需要使用多个主内存读周期原子操作不可中断的一个或一系列操作缓存行填充当处理器识别到从内存中读取操作数是可缓存的,处理器读取整个缓存行到适当的缓存(L1L2.L3 的或所有)缓存命中cache hit如果进行高速缓存行填充操作的内存位置仍然是下次处理器访问的地址时,处理器从缓存中读取操作数,而不是从内存读取写命中。

优快云站内信: https://i.youkuaiyun.com/#/msg/chat/qyj19920704 6458

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【Java并发编程之美 | 第一篇】并发编程线程基础

并发编程线程基础

踢桃的成长之路 1394

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Python并发编程之线程同步详解

Python并发编程中的线程同步是确保多线程程序正确运行的关键。本文介绍了全局解释器锁(GIL)的影响,以及线程同步的必要性。深入讨论了常见的线程同步机制,包括互斥锁、信号量、事件、条件变量和队列,并提供了解决线程同步问题的最佳实践。避免使用全局变量、使用线程安全的数据结构、精细化锁的使用、选择高级同步机制等策略被强调。此外,还强调了测试和调试在多线程编程中的重要性。通过理解并遵循这些指导原则,开发者可以更好地设计和管理多线程程序,确保程序的可维护性、正确性和高性能。

涛哥聊Python 1305

线程同步的2种方法

线程同步的2种方法 ============== 同步的实现方式有两种,同步方法和同步块,这两种方式都要用到synchronized关键字。 (1)同步方法 给一个方法增加synchronized修饰符之后就可以使它成为同步方法,这个方法可以是静态方法和非静态方法, 但是不能是抽象类的抽象方法,也不能是接口中的接口方法。 下面代码是一个同步方法的示例: public

牧海归来 842

深入解析Java并发编程:从线程基础到高级同步

Java并发编程是提升应用性能的关键技术。通过掌握线程的创建与管理、线程同步机制以及高级同步工具,开发者可以构建出既高效又稳定的多线程应用程序。在实际开发中,应根据具体需求选择合适的同步机制,并注意避免死锁和竞态条件等并发问题。随着Java并发库的不断更新和发展,开发者应持续学习和实践,以适应不断变化的技术环境。

极客代码 481

并发编程之线程基础

协作方式机制方式1(锁synchronized)方式2(先唤醒,再挂起)备注当某个线程的suspend()方法被调用时,当前线程被挂起,如果当前线程持有锁,它不会释放锁。即线程挂起时还持有锁死锁死锁弃用当某个线程中执行了wait方法时,线程被放入该对象的等待集合中,并且释放当前持有的对象锁不死锁死锁只能在sychronized语句块中使用,且调用wait、notify的对象与锁对象相同,否则会抛出IllegalMonitorStateException异常。

RubyWinner的博客 859

Java并发编程面试题: 基础知识(线程方法、互斥)

收集大量Java经典面试题目,内容涵盖了包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 等知识点。适合准备Java面试的读者参考和复习。

m0_46013789的博客 1217

9.2 运用API实现线程同步

Windows 线程同步是指多个线程一同访问共享资源时,为了避免资源的并发访问导致数据的不一致或程序崩溃等问题,需要对线程的访问进行协同和控制,以保证程序的正确性和稳定性。Windows提供了多种线程同步机制,以适应不同的并发编程场景。以上同步机制各有优缺点和适用场景,开发者应根据具体应用场景进行选择和使用。在线程同步的实现过程中,需要注意竞争条件和死锁的处理,以确保程序中的线程能协同工作,共享资源能够正确访问和修改。线程同步是并发编程中的重要基础,对于开发高效、稳定的并发应用至关重要。

微软技术分享 5413

C++ 之 并发编程基础

C++并发编程基础 在C++线程库中提供一个native_handle()成员函数,允许通过使用平台相关API直接操作底层实现。 为了并发地运行函数,需要使用特定的函数以及对象来管理各个线程。C++在头文件中提供了管理线程的类和函数 一个简单的Hello, Concurrent World程序: #include <iostream> #include <thread> ...

士杰的博客 1003

并发编程线程基础

JAVA并发编程(一)线程的创建与运行线程的等待与通知等待线程执行终止的join方法线程睡眠sleep方法让出CPU执行权的yield方法线程中断线程死锁 线程的创建与运行 在线程创建之前,需要先知道什么是线程。 线程 是进程的一个实体,线程是进程的一个单一的顺序执行路径,一个进程中至少有一个线程,进程中的多个线程共享进程资源。 Java中线程创建有三种方法: 继承Thread类并重写run方法 实现Runnable接口的run方法 使用FutureTask方式 我们看一下代码实现 package co

zxg的博客 1925

Java-并发-(线程、线程池、同步、并发集合、并发工具、并发编程模型)

指的是在 Java 程序中处理多个任务或线程的能力。Java 提供了丰富的并发编程工具和框架,使得开发者能够更轻松地编写多线程应用程序。

qq_32186487的博客 816
上一篇: Java:异常处理:错误和异常
下一篇: 并发编程:线程同步基础:3、在同步块中使用条件
博风
博客等级 码龄16年 442粉丝 357原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值