synchronized关键字
本节主要作为一个笔记,用来记录synchronized关键字。
首先看一个例子:
public class Mythread extends Thread {private int count = 5;public void run(){count--;System.out.println(this.currentThread().getName() + " count=" + count); }public static void main(String[] args) {Mythread mythread = new Mythread();Thread t1 = new Thread(mythread,"t1");Thread t2 = new Thread(mythread,"t2");Thread t3 = new Thread(mythread,"t3");Thread t4 = new Thread(mythread,"t4");Thread t5 = new Thread(mythread,"t5");t1.start();t2.start();t3.start();t4.start();t5.start(); }
}
执行结果:
显然,前面我们的目的主要是向让count的值进行连续减操作,启用5个线程,然后达到目的。但是结果却不是想象的那样。为此引入Synchronized关键字。
引入synchornized的目的主要在于控制run中的count--操作,因此将关键字加在run方法上。上述代码可以改为:
public synchronized void run(){count--;System.out.println(this.currentThread().getName() + " count=" + count);}
再次执行,可以得到我们想要的结果:
在这里注意前面的 线程顺序,如果仅仅是为了得到后面的43210这个结果,无须考虑,但是如果有兴趣,就会产生疑问,进一步挖掘一下synchornized的知识。
在没有添加synchronized的时候,当多个线程访问Mythread:
五个线程共同访问Mythread中的run方法,大家创建有先后,却需操作CPU资源为其服务,大家集中到Mythread的时候,就需要随缘,看看CPU能够是否能为分配相应的资源。因此就会明白再没有关键字修饰的时候就会产生这样的一系列问题,先创建的线程不一定能够得到自己所需要的资源,而后到的线程也不一定就得不到自己的资源。
各个线程在得到自己的资源之后,开始进行执行,如果各个线程在得到资源的时间点上,count刚好被其中一个线程使用,并且还没有处理完毕,那么其得到的处理结果就可能和其他线程的处理结果相同。这就是在没有加入synchronized的时候的情况。
加入synchronized之后,synchronized锁是对象锁,也就是说new MyThread()的结果就是也new出了一把锁,将新new的对象里面内容都锁起来了,别人想要用这个对象的时候需要这个锁不被占用:
因此,各个线程被创建后,访问mythread类中的run方法的时候会先去请求锁,如果能得到这个锁,才会允许其访问run方法,否则不允许。这样就保证每个线程访问的单一行为,不会造成无序的情况。执行的结果自然就是我们想要的有序结果。
synchronized关键字相关推荐
- Java 多线程(六) synchronized关键字详解
多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题. 同步机制可以使用synchronized关键字实现. 当synchroniz ...
- java线程同步以及对象锁和类锁解析(多线程synchronized关键字)
一.关于线程安全 1.是什么决定的线程安全问题? 线程安全问题基本是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线 ...
- Java 并发编程中使用 ReentrantLock 替代 synchronized 关键字原语
标签: Java 5 引入的 Concurrent 并发库软件包中,提供了 ReentrantLock 可重入同步锁,用来替代 synchronized 关键字原语,并可提供更好的性能,以及更强大的功 ...
- Java多线程:synchronized关键字和Lock
一.synchronized synchronized关键字可以用于声明方法,也可以用来声明代码块,下面分别看一下具体的场景(摘抄自<大型网站系统与Java中间件实践>) 案例一:其中fo ...
- synchronized关键字以及实例锁 类锁
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this ...
- JAVE SE 学习day_09:sleep线程阻塞方法、守护线程、join协调线程同步方法、synchronized关键字解决多线程并发安全问题
一.sleep线程阻塞方法 static void sleep(long ms) Thread提供的静态方法sleep可以让运行该方法的线程阻塞指定毫秒,超时后线程会自动回到RUNNABLE状态,等待 ...
- Java多线程初学者指南(10):使用Synchronized关键字同步类方法
要想解决"脏数据"的问题,最简单的方法就是使用synchronized关键字来使run方法同步,代码如下: public synchronized void run() { ...
- java的同步关键字_简单了解Java synchronized关键字同步
简单了解Java synchronized关键字同步 发布于 2021-1-13| 复制链接 摘记: synchronized synchronized可以用来同步块,同步方法.同步块可以用来更精确 ...
- Java多线程闲聊(六):synchronized关键字
Java多线程闲聊(六):synchronized关键字 前言 这篇文章我会在博客置顶,为什么呢?因为,三篇引用的文章写得太好了,我害怕后面找不到,看不到,然后忘了! 让我想想,感觉昨天的前言把最近肚 ...
- java同步关键字_Java中synchronized关键字修饰方法同步的用法详解
Java的最基本的同步方式,即使用synchronized关键字来控制一个方法的并发访问. 每一个用synchronized关键字声明的方法都是临界区.在Java中,同一个对象的临界区,在同一时间只有 ...
最新文章
- kmeans聚类源代码
- 认证(登录)功能实现
- 地砖中间高四边低_地砖上墙到底好不好?幸好我家没这么做否则全毁了!
- 连续加班2周做出来的功能,老板说先不做了
- 【苹果cms10 Maccmsv10 站群深度定制版 开发日志】 新增日志模块
- python中 if __name__ == ‘__main__‘
- Google,Guava本地高效缓存
- 星云的Linux专用学习手册
- ai人工智能使用的软件_MachineRay:使用AI创造抽象艺术
- 易语言手动和代码创建数据库
- c语言九宫格拼图程序,C语言简单游戏编程学习入门之九宫格拼图
- Exception: ROM is missing for pong, see https://github.com/openai/atari-py#roms for instructions
- 简单粗暴的动态气泡图
- [嵌入式]Cortex-A8处理器编程(上)
- 关于win10输入法导致电脑直接卡机无法动弹问题
- Linux下配置DNS服务
- 字符串格式化(format()使用)
- ROI Pooling的作用及意义
- win10出现的各种问题
- php 提取登录QQsid_PHP实现QQ登录实例代码
热门文章
- 手机加速度传感器在Android横竖屏切换中的应用
- Hibernate与JPA
- android 坚挺通话广播_Android智能机 摩托罗拉MileStone坚挺
- 奔向三张,不破不立:一个iOS开发工程师的职业规划思考(转自iOSer 逆,以资激励)
- R语言cowplot介绍——把不同的图像拼接到一起
- matplolib种横坐标斜着显示
- 第四次作业-微软必应词典客户端
- Android Studio 从入门到精通视频教程
- requests.exceptions.ChunkedEncodingError: (‘Connection broken: IncompleteRead(0 bytes read)‘, Incomp
- Alex Woodie:2019大数据预测