Java使用synchronized进行多线程同步

线程安全你还在用synchronized? 你还在用synchronized?线程安全相关知识深入剖析 立即下载

        多个线程访问一些程序中的资源时,会发生资源抢占。我们用线程同步来解决这个问题,保证线程安全。

如果有一个全局变量 int sum = 1;有A,B两个线程对sum进行操作,他们获取资源时都是sum = 1,而线程A对其进行+1写回去变成了 2,如果我们希望线程B对其也进行+1操作后sum = 3,但是因为B线程获取到的是sum = 1,所以操作后写回去也是sum = 2 。为了解决类似的问题,引入了锁的概念——即在一个线程操作时进行锁定,暂时不给别的资源操作,直到其释放。

例子:使用synchronized进行同步

先看不加锁的情况:

class Total {
	private int sum;  //共享资源
	public Total() {
		this.sum = 0;
	}
	public int getSum() {
		return sum;
	}
	public void setSum(int sum) {
		this.sum = sum;
	}
	
	
}
class TotalTest implements Runnable {
	static final Total total = new Total();
	@Override
	public void run() {
		for(int i = 0;i<1000;i++) {
			total.setSum(total.getSum()+1);
		}
	}
	
}

public class T_test {
	
	public static void main(String[] args) {
		TotalTest tt1 = new TotalTest();
		/*
		 * 开了两个线程进行模拟 ,如果输出的sum结果不等于2000
		 * 那么就说明出现了线程安全问题
		 */
		Thread t1 = new Thread(tt1);
		Thread t2 = new Thread(tt1);
		t1.start();
		t2.start();
		try {
			t1.join();
			t2.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		System.out.println(tt1.total.getSum());
	}

}

输出: 1181

解决方案:在访问共享资源的代码块外加上同步锁

class TotalTest implements Runnable {
	static final Total total = new Total();
	@Override
	public void run() {
		for(int i = 0;i<1000;i++) {
			synchronized (this) { //加入了实例锁
				total.setSum(total.getSum()+1);
			}
			
		}
	}
	
}

前面我们只实例化了一个线程实例,加实例锁可以解决线程同步问题。下面我们实例化两个线程对象

public class T_test {
	
	public static void main(String[] args) {
		TotalTest tt1 = new TotalTest();
		TotalTest tt2 = new TotalTest();
		/*
		 * 开了两个线程进行模拟 ,如果输出的sum结果不等于2000
		 * 那么就说明出现了线程安全问题
		 */
		Thread t1 = new Thread(tt1);
		Thread t2 = new Thread(tt2);
		t1.start();
		t2.start();
		try {
			t1.join();
			t2.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		System.out.println(tt1.total.getSum());
	}

}

这时输出:1970

解决方案 :加上类级锁

public void run() {
		for(int i = 0;i<1000;i++) {
			synchronized (TotalTest.class) { //加上了TotalTest类级锁
				total.setSum(total.getSum()+1);
			}
			
		}
	}

输出:2000



RT-Thread网络编程:基于STM32F407的TCP客户端实现(含完整代码解析) 本文详细介绍了在STM32F407平台上,基于RT-Thread操作系统和LWIP协议栈实现工业级可靠TCP客户端的完整过程。内容涵盖底层ETH驱动配置、Socket编程、连接保活与断线重连机制、数据收发协议设计以及资源管理,提供了可应用于实际项目的健壮代码框架与调试技巧。 阅读详情

相关推荐

c#.net使用正则表达式验证文本中是否包含手机号码或电话号码?

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Collections; namespace RegularPhoneApp { class Program

码农 3584

java 线程同步控制_JAVA多线程同步 synchronized用法

Java的多线程是无序的,是由JVM来调度的。我们不能控制哪个线程先执行,但是可以用synchronized方法或者synchronized同步块,来控制线程在特定部分按顺序执行。我们用银行取钱这个例子来说明synchronized的用法:创建一个银行类,里面写上存钱取钱的方法(存钱是正数,取钱是负数,我就只写一个方法了)public class Bank{int money;String acc...

weixin_32306771的博客 137

遥感卫星影像AI数据集格式规范详解、技术原理与数据生产全流程技术手册

本技术手册旨在系统性地梳理遥感卫星影像AI数据集的各类格式标准(涵盖VOC、COCO、YOLO及遥感专用DOTA格式等),深入剖析其背后的技术原理,并详细阐述数据生产的全过程,涵盖预处理、标注、质量控制及数据增强等关键环节。无论您是刚入门的算法工程师,还是资深的数据生产管理者,本手册都将为您提供详实的参考与指引。

panshengwu的博客 1129

java多线程同步与测试_关于JAVA多线程并发synchronized的测试与合理使用

在项目开发中, 或许会碰到JAVA的多线程处理, 为保证业务数据的正常, 必须加上锁机制, 常用的处理方法一般是加上synchronized关键字, 目前JDK版本对synchronized已经做了很好的优化, 我们不用再考虑其性能, 但在实际使用中, 往往由于处理不当, 导致系统性能的严重下降, 那么该如何合理的使用synchronized, 必须对其使用方式有个全面了解, 在网上搜...

weixin_31109487的博客 266

开源大模型“去审查化”技术解析:从LLaMA架构到本地部署与伦理边界

大型语言模型(LLM)基于Transformer架构,通过海量数据训练获得理解和生成自然语言的能力。其核心原理在于自注意力机制对上下文关系的建模。为了确保输出内容的安全与合规,主流模型普遍采用基于人类反馈的强化学习(RLHF)等技术进行安全对齐。这一过程旨在使模型行为符合人类价值观,是AI伦理工程实践的关键环节。然而,在特定研究场景下,如对抗性测试或内容安全算法研究,技术人员需要模拟极端对话以评估系统鲁棒性,这催生了针对“去对齐”或“移除护栏”的技术探索。此类技术通常通过对预训练模型进行反向微调或继续训练来

weixin_33743880的博客 590

操作系统笔记(含王道计算机考研——操作系统课件)

操作系统(OS) 笔记根据B站王道计算机考研——操作系统视频整理所得,视频链接:https://b23.tv/0I2qex 视频中所用课件:链接:https://pan.baidu.com/s/101bFWm0Tv0emNpEneidYPA 提取码:y3dd 1.计算机系统概述 1.简介 什么是操作系统? 操作系统(Operating Ststem, OS)是指控制和管理整个计算机系统的硬件和软件资源,并合理地组织调度计算机的工作和资源的分配,以提供给用户和其他软件方便的接口和环境,它是

拧发条鸟的博客 6万+

Java多线程(二)——synchronized 详解

java多线程

m0_45198397的博客 5335

基于泰勒展开改进的物理信息神经网络

基于泰勒展开改进的物理信息神经网络

天天酷科研的博客 503

Java多线程知识小结:Synchronized

Java中的synchronized关键字是实现线程同步的核心工具,通过对象头中的Monitor机制保证共享资源的线程安全。它提供三种使用方式:实例方法锁(对象锁)、静态方法锁(类锁)和代码块锁(灵活锁)。Java 6优化后引入锁升级机制(无锁→偏向锁→轻量级锁→重量级锁),提升了性能。关键特性包括可重入性、原子性与可见性,以及异常自动释放锁。典型应用包括保护共享资源、实现单例模式等。优化建议包括缩小同步范围、使用细粒度锁等。相比其他同步方案,synchronized简洁可靠,是Java并发编程的基础设施。

William Chen's knowledge base 841

【2026年华为暑期实习-非AI方向(通软&嵌软&测试&算法&数据科学)- 7月15日-第二题- 手机多载波冲突选择】(题目+思路+Java&C++&Python解析+在线测试)

摘要 本文提出了一种解决手机基站载波选择问题的回溯算法。给定N个载波,每个载波具有带宽和所属频段,要求选择最多K个载波,满足:1) 不选择同一频段的多个载波;2) 不选择冲突频段的载波;3) 总带宽最大化。算法通过预处理冲突关系,使用位掩码优化冲突检查,按编号顺序回溯枚举所有可能组合。当找到更大带宽或相同带宽但字典序更小的组合时更新答案。该方法在N≤25和K≤8的约束下高效可行,并通过样例验证了正确性。输出为最大总带宽和对应的最优载波编号序列。

m0_73659489的博客 71

File Load Error for Untitled.ipynb Unhandled error 解决方案

本文主要介绍了File Load Error for Untitled.ipynb Unhandled error 解决方案,希望能对使用jupyter notebook的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 1万+

【多线程】一文详解synchronized

Java中的所有锁都是可重入锁Java并没有内置不可重入锁,常见的和都属于可重入锁可重入锁指的是可重复可递归调用的锁,在外层使用锁之后,在内层仍然可以使用,并且不发生死锁,这样的锁就叫做可重入锁。与可重入锁相反,不可重入锁不可递归调用,递归调用就发生死锁。隐式锁(即关键字使用的锁)默认是可重入锁显式锁(即Lock)也有这样的可重入锁。Monitors。

2301_78320637的博客 1343

Apollo Planning决策规划算法代码详细解析 (2):Scenario执行

上一章节讲Scenario的决策逻辑,当确认当前Scenario后,本章节继续深入讲解在代码中,Scenario的执行过程。Scenario的Process()函数根据配置文件顺序执行stage,并判断目前处于哪个stage。当确认好stage后调用该stage对应的Process()函数,来进行具体的规划任务。 码字不易,喜欢的朋友们麻烦点个关注与赞。 在本文你将学到下面这些内容: Scenario的Process()函数的作用于调用方式; Scenario对象的初始化方法; 如何给每个Scen

自动驾驶Player的博客 5609

Java 使用synchronized达到多线程同步

A线程先持有object对象的Lock锁,B线程可以以异步的方式调用object对象中的非synchronized类型的方法。 A线程先持有object对象的Lock锁,B线程如果在这时调用object对象中的synchronized类型 的方法则需等待,也就是同步。 脏读:在读取实例变量时,此值已经被其他线程更改过了。不同线程争抢实例变量的结果。 为了避免数据出现交叉的情况,使用synchro...

抛弃幻想,准备斗争 414

NTscan扫描工具

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

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

java 同步 实例_Java中使用synchronized多线程同步的实例

synchronized关键字Java提供了synchronized关键字,用于控制台多线程同步。可以加在方法上,在方法名前加synchronized;也可以加在一段代码块,synchronized (xxx) { ... },其中xxx为对象,一般为this, Xxx.class或者某个对象实例。实例1import java.util.concurrent.ThreadLocalRandom;i...

weixin_28744601的博客 261

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java多线程同步 synchronized 关键字的使用

代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行它包括两种用法:synchronized 方法和 synchronized 块。 JAVA多线程买票案例synchronized 同步用synchronized 块实现同步 pu

裸奔的小猪 556

java 分布式 线程同步_Java多线程同步Synchronized使用分析

由于servlet 是多线程单例的。struts1 的前端控制器是单例的,线程不安全的;每次请求都会用同一actionServlet;struts2 的action不是单例的,线程安全的;每次请求都会新new一个action来接收;因此如果使用 servlet 或者strtus1 线程安全问题,不能不考虑,下面内容。同步的概念:同步分为 同步方法 和 同步块 两种方式。锁定的内容分为 锁定类的某个...

weixin_39890629的博客 267

Java多线程:使用Synchronized关键字同步类方法

本文介绍使用Synchronized关键字同步类方法。要达成Java多线程的run方法同步,需要在void和public之间加上synchronized关键字。   要想解决“脏数据”的问题,最简单的方法就是使用synchronized关键字来使run方法同步,代码如下: public synchronized void method() { }   从上面的代...

Jelly_JAVA博客 188

十一、初学Java多线程:使用Synchronized块同步变量

本文是Java多线程初学教程中的最后一部分,讲解如何使用Synchronized块同步变量。我们可以通过synchronized块来同步特定的静态或非静态方法。 AD:2013大数据全球技术峰会课程PPT下载 我们可以通过synchronized块来同步特定的静态或非静态方法。要想实现这种需求必须为这些特性的方法定义一个类变量,然后将这些方法的代码用synchronized块括起来,并将这

zb402230366的专栏 609

Java多线程访问Synchronized同步方法的八种使用场景

简介 本文将介绍8种同步方法的访问场景,我们来看看着八种情况下,多线程访问同步方法是否还是线程安全的。这些场景是多线程编程中经常遇到的,而且也是面试时高频被问到的问题,所以不管是理论还是实践,这些都是多线程场景必须要掌握的场景。 七种使用场景: 接下来,我们来通过代码实现,分别判断以下场景是不是线程安全的,以及原因是什么。 两个线程同时访问同一个对象的同步方法 两个线程同时访问两个对象的同步方法 两个线程同时访问(一个或两个)对象的静态同步方法 两个线程分别同时访问(一个或两个)对象的同步方法和非同步方法

五道口 3056

Java多线程同步Synchronized使用分析

由于servlet 是多线程单例的。 struts1 的前端控制器是单例的,线程不安全的;每次请求都会用同一actionServlet; struts2 的action不是单例的,线程安全的;每次请求都会新new一个action来接收; 因此如果使用 servlet 或者strtus1 线程安全问题,不能不考虑,下面内容。 同步的概念: 同步分为 同步方法 和 同步块 ...

wentao365的专栏 82

java使用synchronized完成多线程同步安全

package syn; public class bbb implements Runnable{          aaa a=new aaa();     @Override     public void run() {         //使用synchronized完成线程同步安全         synchronized(a){             //判断余额是否&gt;...

ZhangYuesong0923的博客 295

Java多线程同步 synchronized关键字的简单使用

Java有许多进程同步的方法,其中synchronized关键字的使用比较简单。Java每个对象都有一个内部锁,用synchronized关键字直接修饰方法,可以在方法调用时自动上锁,在方法结束调用时自动解锁。 线程未同步示例 注意:Thread.sleep(x)线程延时方法一定要有,不然可能会因为程序执行太快看不到进程冲突,导致数字正常减小。 public class Main { public static void main(String[] args) { MyRunnabl

qq_44829047的博客 209

初学Java多线程:使用Synchronized关键字同步类方法

初学Java多线程:使用Synchronized关键字同步类方法 本文介绍使用Synchronized关键字同步类方法。要达成Java多线程的run方法同步,需要在void和public之间加上synchronized关键字。 AD: 要想解决“脏数据”的问题,最简单的方法就是使用synchronized关键字来使run方法同步,代码如下: p

小范屯 1103

java多线程编程同步方法_java多线程编程之使用Synchronized块同步方法

synchronized块来同步一个对象变量,也可以使用synchronized块来同步类中的静态方法和非静态方法,下面使用Synchronized块同步方法synchronized关键字有两种用法。第一种就是在《使用Synchronized关键字同步类方法》一文中所介绍的直接用在方法的定义中。 另外一种就是synchronized块。我们不仅可以通过synchronized块来同步一个对象变量。...

weixin_39880666的博客 147
上一篇: hashCode()方法对HashSet,HashMap的重要作用
下一篇: 多线程中生产者消费者模型代码练习
bingoCoder
博客等级 码龄10年 1400粉丝 157原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值