Java线程的同步 - synchronized
为什么要在线程里面使用同步 - synchronized
首先看个列子:
假设系统里面有5张票,有个卖票的系统,执行完,打印的结果是这样的:
public class RunDemo05 implements Runnable {
private int count = 5;
public void run()
{
for(int i=0;i<10;i++)
{
sale();
}
}
public void sale(){
if (count>0)
{
try{
Thread.sleep(1000);
}
catch(Exception e){
e.printStackTrace();
}
System.out.println(count--);
}
}
public static void main(String[] args) {
RunDemo05 r = new RunDemo05();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
Thread t3 = new Thread(r);
t1.start();
t2.start();
t3.start();
}
}
结果:
5
3
4
2
1
2
出现这样的原因: 在同一时刻有多个线程访问count数据,所以导致这种结果。
synchronized可以解决这个问题,它是的系统里面的某一时刻只有一个线程在运行。
synchronized的使用方法: 1. 使用synchronized方法 2. 使用synchronized程序块
package com.pwc.thread;
public class RunDemo05 implements Runnable {
private int count = 5;
public void run()
{
for(int i=0;i<10;i++)
{
sale();
}
}
public synchronized void sale(){
if (count>0)
{
try{
Thread.sleep(1000);
}
catch(Exception e){
e.printStackTrace();
}
System.out.println(count--);
}
}
public static void main(String[] args) {
RunDemo05 r = new RunDemo05();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
Thread t3 = new Thread(r);
t1.start();
t2.start();
t3.start();
}
}
结果:
5
4
3
2
1
使用synchronized程序块:
package com.pwc.thread;
public class RunDemo05 implements Runnable {
private int count = 5;
public void run()
{
for(int i=0;i<10;i++)
{
sale();
}
}
public void sale(){
synchronized(this){
if (count>0)
{
try{
Thread.sleep(1000);
}
catch(Exception e){
e.printStackTrace();
}
System.out.println(count--);
}
}
}
public static void main(String[] args) {
RunDemo05 r = new RunDemo05();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
Thread t3 = new Thread(r);
t1.start();
t2.start();
t3.start();
}
}
结果:
5
4
3
2
1
转载于:https://www.cnblogs.com/tman/p/3977305.html
Java线程的同步 - synchronized相关推荐
- Java线程的同步和异步的区别
1. 同步与异步 多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成的,有时为了解 决此 ...
- 【Java线程安全】 synchronized同步方法、同步块:模拟抢票、模拟取款
synchronized的使用 大佬之所以叫大佬,就是因为他们即使一次看不懂,看二十遍也要看懂,再对萌新说:这个方法不是挺简单的嘛 1.同步方法 要注意的是,synchronized锁的不是方法,而是 ...
- java线程(2)--同步和锁
1.线程的内存模型 Java作为平台无关性语言,JLS(Java语言规范)定义了一个统一的内存管理模型JMM(Java Memory Model),JMM屏蔽了底层平台内存管理细节,在多线程环境中必须 ...
- Java线程中关于Synchronized的用法
synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种: 1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代 ...
- java线程同步的实现方式
这里抛砖引玉,为何要使用同步? 当多个线程同时操作一个可共享的资源时会出现线程安全问题,将会导致数据不一致,因此使用同步锁来防止该操作执行完之前不许被其他线程执行,从而保证了该变量的唯一性和准确性.下 ...
- java线程基础知识整理
线程基本概念 1.什么是进程?什么是线程? 进程是一个应用程序,线程是一个进程中的执行场景/执行单元.一个进程可以启动多个线程.在java语言中对于两个线程A和B,堆内存和方法区内存共享.但是栈内存独 ...
- java 线程管理框架_实现 Java 多线程并发控制框架
所面临的问题 图 1. 线程场景 这幅图中节点代表一个 single Thread,边代表执行的步骤. 整幅图代表的意思是,ROOT 线程执行完毕后执行 T1 线程,T1 执行完毕后并发的执行 T2 ...
- Java线程(二):线程同步synchronized和volatile
上篇通 过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么 会产生这样的结果呢,因为建立的Count对象是 ...
- java线程同步——条件对象+synchronized 关键字
[0]README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java线程同步--条件对象+synchronized 关键字 的相关知识: 0.2)for ...
最新文章
- discuz 二次开发文章
- Python 09--多线程、进程
- 用pytorch及numpy计算成对余弦相似性矩阵,并用numpy实现kmeans聚类
- 7-2 单源最短路径 (10 分)(思路+详解+邻接表做法)Come Brather!!!!!!!!!!
- 如何创建Java程序
- Docker容器网络解析
- 20190903:(leetcode习题)颠倒二进制位
- python实现找到给定列表中满足给定和的所有子列表,元素可重复使用
- java数据库查询类
- Excel数据转化为sql脚本
- wifi 小米pro 驱动 黑苹果_macOS安装教程兼小米Pro安装过程记录
- STM32 F072RB 低功耗 开发调试
- 如何官网下载 IEEE 论文 Latex 和 Word 模板
- img 标签的 height 和 width 属性设置图像的尺寸。
- python投资组合有效边界,软核科普系列:用python帮你建立自己的投资组合
- Windows10键盘快捷键大全
- linux命令整理(三)
- 使用 Wowza IDE 开发第一个 Wowza 服务器扩展应用 -- 监控直播频道
- spire.xls.free操作excel简单实用
- linux下的lib文件
热门文章
- GitHub 推出安全新功能,帮助开源软件发现漏洞和机密信息
- 2018年《DevOps 现状报告》新鲜出炉:行业脉动与团队发展指导一览
- Linux服务器下LNMP安装与配置方法
- InflateException:Bin file line #19:Error inflating class MyTextView
- RedHat 7配置keepalived+LVS实现高可用的Web负载均衡
- Zabbix 3.0 安装部署
- 完整学习git三 查看暂存区目录树 git diff
- python学习之dict的items(),values(),keys()
- 与缓存有关的http-header
- ACM算法书籍推荐zz