java同步synchronized

java同步synchronized

 

      volatile仅仅用来保证该变量对所有线程的可见性,但不保证原子性。

 

      看下面的这段代码:

/**
 * 
 * @author InJavaWeTrust
 *
 */
public class CountVolatile implements Runnable {
	public static CountVolatile instance = new CountVolatile();
	public static volatile int i = 0;
	public static void increate() {
		i++;
	}
	public void run() {
		for (int c = 0; c < 10000000; c++) {
			increate();
		}
	}
	public static void main(String[] args) throws InterruptedException {
		Thread t1 = new Thread(instance);
		Thread t2 = new Thread(instance);
		t1.start();
		t2.start();
		t1.join();
		t2.join();
		System.out.println(i);
	}
}

         这段代码演示了一个计数器,两个线程同时对i进行累加,个执行10000000次。我们希望的执行结果是最终i的值可以达到20000000,但事实并非总是如此。很多时候,i的值会小于期望的数值20000000。这是因为两个线程同时对i进行写入时,其中一个线程的结果会覆盖另外一个线程的结果。

 

       要从根本上解决这个问题,我们就必须保证多个线程在对i进行操作时完全同步。

 

       关键字synchronized的作用是实现线程间的同步。当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

 

       关键字synchronized的几种用法。

 

  • 指定加锁对象:对给定对象加锁,进入同步代码钱要获得给定对象的锁。
  • 直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得当前实例的锁。
  • 直接作用于静态方法:相当于对当前类加锁,进入同步代码前要获得当前类的锁。

 

一、指定加锁对象:

/**
 * 
 * @author InJavaWeTrust
 *
 */
public class CountSynchronized implements Runnable {
	public static CountSynchronized instance = new CountSynchronized();
	public static int i = 0;
	public void run() {
		for (int c = 0; c < 10000000; c++) {
			synchronized(instance) { //对给定对象加锁
				i++;
			}
		}
	}
	
	public static void main(String[] args) throws InterruptedException {
		Thread t1 = new Thread(instance);
		Thread t2 = new Thread(instance);
		t1.start();
		t2.start();
		t1.join();
		t2.join();
		System.out.println(i);
	}
}

  

二、直接作用于实例方法:

 

/**
 * 
 * @author InJavaWeTrust
 *
 */
public class CountSynchronized2 implements Runnable {
	public static CountSynchronized2 instance = new CountSynchronized2();
	public static int i = 0;
	public synchronized void increate() { //对当前实例方法加锁
		i++;
	}
	public void run() {
		for (int c = 0; c < 10000000; c++) {
			increate();
		}
	}
	
	public static void main(String[] args) throws InterruptedException {
		Thread t1 = new Thread(instance);
		Thread t2 = new Thread(instance);
		t1.start();
		t2.start();
		t1.join();
		t2.join();
		System.out.println(i);
	}
}

 

三、直接作用于静态方法:

 

/**
 * 
 * @author InJavaWeTrust
 *
 */
public class CountStaticMethod implements Runnable {
	static int i = 0;
	public static synchronized void increate() { //相当于对当前类加锁
		i++;
	}
	public void run() {
		for (int c = 0; c < 10000000; c++) {
			increate();
		}
	}
	
	public static void main(String[] args) throws InterruptedException {
		Thread t1 = new Thread(new CountStaticMethod());//new一个对象
		Thread t2 = new Thread(new CountStaticMethod());//new一个对象
		t1.start();
		t2.start();
		t1.join();
		t2.join();
		System.out.println(i);
	}
}

 

 

 

 

 

YOLOv10注意力革新:小波域注意力(WDA)如何实现多尺度特征精准聚焦 本文深入解析YOLOv10中的小波域注意力(WDA)机制,探讨其如何通过频域分解与动态聚焦实现多尺度特征精准提取。WDA模块结合离散小波变换与注意力机制,显著提升小目标检测性能,在VisDrone数据集上AP提升达12.6%。文章详细介绍了两种集成方案及代码实现,为计算机视觉开发者提供实用指南。 阅读详情

相关推荐

深入解析.Net中SM2与sm-crypto的跨平台加解密实践

本文深入探讨了在.Net平台与前端sm-crypto库之间实现SM2国密算法跨平台加解密的实践方案。针对对接中常见的密钥格式、密文拼接顺序(C1C3C2与C1C2C3)等核心难点,提供了基于BouncyCastle的完整工具类实现、前后端联调示例及问题排查指南,旨在帮助开发者构建安全、兼容的数据加密通道。

weixin_29322855的博客 370

java中的synchronized

synchronized是Java中的关键字,用于实现线程之间的同步。它提供了一种独占锁的机制,确保在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作),同时我们还应该注意到synchronized另外一个重要的作用,synchronized可保证一个线程的变化(主要是共享数据的变化)被其他线程所看到(保证可见性,完全可以替代Volatile功能),这点确实也是很重要的。

qq_56936805的博客 2650

Eureka常见面试题总结

点击关注我的博客原文 Eureka是Netflix组件的一个子模块,也是核心模块之一。云端服务发现,一个基于 REST 的服务,用于定位服务,以实现云端中间层服务发现和故障转移(来源springcloud中文网的介绍:https://www.springcloud.cc/)。下图总结了Eureka服务端(以下简称服务端)与Eureka客户端(以下简称客户端)之间协同工作的流程: 流程说明:...

u012105931的博客 2万+

java中synchronized的用法详解

记下来,很重要。 Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。      一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。      二、然而,当一个线程访问ob

amogin的专栏 461

fMRI脑影像特征提取——静息态与任务态,ALFF/fALFF和ReHo(Dpabi,Rest1.8)

任务态和静息态是大脑的两种状态,前者主要是指大脑在执行记忆、识别以及运动等具体任务时的状态,静息态则是指大脑不执行具体认知任务、保持安静、放松、清醒时的状态,是大脑所处的各种复杂状态中最基础和最本质的状态。任务态fMRI分析有非常悠远的历史,而静息态fMRI自1995年biswal教授及其同事率先报告静息态fMRI具有生理意义后,越来越多的人进入了静息态的研究领域。任务态fMRI主流的分析方法是模型驱动(GLM+HRF),也可以引用静息态fMRI

意疏的学习笔记 6万+

Keil环境下单片机串口通信实战:如何用printf发送中文(附完整代码)

本文详细解析了在Keil开发环境下,单片机通过串口通信发送中文信息时产生乱码的根本原因及解决方案。核心在于理解并统一编码(如GB2312或UTF-8),并正确重定向printf函数。文章提供了针对STC89C52和STM32F103的完整代码示例,涵盖工程配置、编码设置、调试技巧,帮助开发者实现稳定可靠的中文串口输出。

weixin_29168675的博客 468

Java的线程同步方法synchronized

package cn.zxx.base; public class Num { private int x=0; private int y=0; public synchronized void increase(){ //同步方法 x++; y++; } public void runEquals(){ System.out.println("x="+x...

路~可以走过 220

如何在 Windows 中实时打开字幕

在 Windows 操作系统中,你可以使用编程来实现实时字幕功能,以便在屏幕上显示即时的文字内容。下面是一个示例代码,展示了如何使用Python编程语言在Windows上实现实时字幕功能。这样,字幕窗口将会不断地显示系统当前时间作为字幕。你可以根据自己的需求修改主循环中的内容,以显示你想要的实时字幕。希望以上代码和说明能够帮助你在Windows中实现实时字幕功能。函数创建了一个顶级窗口,并设置窗口的样式、位置和大小。方法,用于在字幕窗口中显示指定的字幕内容。上述代码中,我们使用了Python的。

DevWizard的博客 3272

java同步的实现方式,以及synchronized与Lock的异同

C、tryLock(long timeout, TimeUnit timeUnit)方法:如果获取了锁定立即返回true,如果别的线程正持有锁,会等待参数给定的时间,在等待的过程中,如果获取了锁定,就返回true,如果等待超时,返回false。java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(如数据的增删改查),相互之间产生冲突,将会导致数据不准确,因此加入同步锁以避免在该线程没有完成操作之前,被其他线程的调用,从而保证了该变量的唯一性和准确性。

cxbtdd的博客 1030

飞牛NAS打造成童年经典游戏机

这篇文章介绍如何使用飞牛NAS搭建经典游戏模拟器。首先需开启Docker并下载RetroArch-web镜像,随后创建容器并设置端口映射。启动后上传游戏ROM文件(如NES格式),在模拟器中加载即可游玩。文章以修改版坦克大战为例,详细说明按键配置方法。同时还提到公网访问需配置DDNS或使用ZeroTier内网穿透。通过这套方案,用户可以在NAS上重温红白机等经典游戏体验。

dgnankai的专栏 886

如何利用gretna软件计算脑网络全局属性(聚类系数,小世界属性,最短路径),局部属性指标(度,度分布,节点效率),如何理解网络稀疏度

grena工具箱被设计用于fMRI数据的图论网络分析。它是一套MATLAB函数和基于MATLAB的接口,用于常规的fMRI预处理,用于计算和统计分析最常用的网络指标,如小世界参数、效率、度、间性、关联性、层级性、同步性和模块化。......

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 9175

Java 同步代码块synchronized

如何使用synchronizedsynchronized 关键字​ 同步代码块 synchronized 原理浅析 如何使用Java同步代码块synchronized 2018年拍摄于日本奈良的小鹿,鹿随便摸,手感棒棒的。 微信公众号 王皓的GitHub:https://github.com/TenaciousDWang 上回说到线程的生命周期,今天接着说一下并发编程中...

JavaBoy王皓 922

Python爬虫实战:使用最新技术爬取GitHub Trending项目

本文将详细介绍如何使用Python最新技术栈构建一个高效的GitHub Trending爬虫。我们将使用异步请求库httpx、HTML解析库parsel、数据存储方案以及反反爬技术,完整实现一个能够稳定获取GitHub Trending数据的爬虫系统。文章包含5000余字详细教程,从环境搭建到代码实现,再到数据处理和存储,最后部署运行,提供全方位指导。GitHub Trending页面展示了GitHub上当前最受欢迎的项目,对于开发者了解技术趋势、发现优秀项目非常有价值。

2201_76125261的博客 739

java中同步锁synchronized与Lock的区别

同步锁: java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁。线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁。获得内置锁的唯一途径就是进入这个锁的保护的同步代码块或方法。 java内置锁是一个互斥锁,这就是意味着最多只有一个线程能够获得该锁,当线程A尝试去获得线程B持有的内置锁时,线程A必须等待或者阻塞,知道线程B释放这个锁,如果B...

gm371200587的博客 3万+

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java同步之synchronized

Java中可以使用关键字synchronized进行线程同步控制,实现关键资源顺序访问,避免由于多线程并发执行导致的数据不一致性等问题。synchronized的原理是对象监视器(锁),只有获取到监视器的线程才能继续执行,否则线程会等待获取监视器。Java中每个对象或者类都有一把锁与之相关联,对于对象来说,监视的是这个对象的实例变量,对于类来说,监视的是类变量(一个类本身是类Class的对象,所以

守得云开见明月 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

JAVA中同步锁synchronized的使用

JAVA中同步锁synchronized的使用

qq_35321791的博客 3011

Statistics and Machine Learning Toolbox

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

java同步锁synchronized_Java性能之synchronized锁的优化

synchronized / Lock1.JDK 1.5之前,Java通过synchronized关键字来实现锁功能synchronized是JVM实现的内置锁,锁的获取和释放都是由JVM隐式实现的2.JDK 1.5,并发包中新增了Lock接口来实现锁功能提供了与synchronized类似的同步功能,但需要显式获取和释放锁3. Lock同步锁是基于Java实现的,而synchronized是基于...

weixin_39949297的博客 145

java synchronized 卖票_Java线程同步(synchronized)——卖票问题

卖票问题通常被用来举例说明线程同步问题,在Java中,采用关键字synchronized关键字来解决线程同步的问题。Java任意类型的对象都有一个标志位,该标志位具有0,1两种状态,其开始状态为1,当某个线程执行了synchronized(object)语句后,object对象的标志位变为0状态,直到执行完整个synchronized语句中的代码块后,该对象的标志位又回到1状态。当一个线程执行到s...

weixin_28748867的博客 336

如何使用java synchronized进行线程同步

这篇文章从网上找到的,作者是谁不详,因为到处都是转帖。看了之后,解开了我对synchronized的一些疑问,同时也验证了我之前的理解是正确的,记录下来。 在java编程思想中对synchronized的一点解释:1、synchronized关键字的作用域有二种: 1)是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的s

soartju的专栏 2万+

JAVA synchronized同步块

Java 中同步关键字(synchronized) Java语言的关键字,可用来给对象和方法或者代码块加锁,当它锁定一个方法或者一个代码块的时候,同一时刻最多只有一个线程执行这段代码。当两个并发线程访问同一个对象object中的这个加锁同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。然而,当一个线程访问object的一个加锁代码块时...

innerpeacez成长之路 672

java synchronized 同步锁2

未加锁 package study_3; public class synTest3 { public static void main(String[] args) { Cinema cinema = new Cinema(20, "电影院1"); new Thread(new Customer(cinema, 2),"john").start(); new Thread(...

u014248032的博客 275

Java线程同步中关键字synchronized简述

Java线程同步中关键字synchronized简述 一、作用: synchronized关键字通过修饰一个方法或者声明一个代码块,从而产生一个同步对象锁以及对应的同步代码块。每当有线程要对该同步代码块进行访问时,线程就会首先尝试去获取该对象锁,并在成功获取到对象锁后,对该同步代码块进行正常访问,在同步代码块访问过程中,线程会一直持有该对象锁直到同步代码块访问完毕才会释放。在上

什么乱七八糟的 4363

Java线程同步Synchronized

需要注意的是,synchronized关键字只能保证同一时间内只有一个线程执行被修饰的代码逻辑,但并不能保证执行顺序。synchronized关键字可以用来修饰方法或代码块,保证在同一时间内只有一个线程可以执行被synchronized关键字修饰的代码。在上面的示例中,使用synchronized修饰了increment方法。当一个方法被synchronized修饰时,该方法称为同步方法。同一时间内只有一个线程可以访问该方法,其他线程需要等待直到锁被释放才能继续执行。

m0_66130067的博客 588

java中用synchronized实现同步处理

synchronized Java中提供synchronized关键字实现同步处理,用synchoronized可以修饰代码块,修饰方法,来完成对 对象加锁,对类加锁的操作。synchoronized是重量级锁。意思就是当有一个线程A进入时其他想访问的线程阻塞师等待,等待该线程A执行完整个加锁区间,系统自动释放锁,并唤醒等待的其他线程竞争锁。 对象锁 synchronized修饰同步代码块 --锁...

坚持不懈做贡献 1731

Java同步原语synchronized、volatile

synchronized 一般的多线程,执行顺序随机: public class ThreadTest { public static void main(String[] args) { for(int i=0;i<3;i++) { MyThread temp=new MyThread(); temp.start(); } } } class MyTh...

weixin_34087307的博客 248
上一篇: 自动生成代码工具 maven pom
下一篇: 自动生成代码工具 配置文件
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值