为什么要在线程里面使用同步 - 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相关推荐

  1. Java线程的同步和异步的区别

    1. 同步与异步 多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成的,有时为了解 决此 ...

  2. 【Java线程安全】 synchronized同步方法、同步块:模拟抢票、模拟取款

    synchronized的使用 大佬之所以叫大佬,就是因为他们即使一次看不懂,看二十遍也要看懂,再对萌新说:这个方法不是挺简单的嘛 1.同步方法 要注意的是,synchronized锁的不是方法,而是 ...

  3. java线程(2)--同步和锁

    1.线程的内存模型 Java作为平台无关性语言,JLS(Java语言规范)定义了一个统一的内存管理模型JMM(Java Memory Model),JMM屏蔽了底层平台内存管理细节,在多线程环境中必须 ...

  4. Java线程中关于Synchronized的用法

    synchronized是Java中的关键字,是一种同步锁.它修饰的对象有以下几种:  1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代 ...

  5. java线程同步的实现方式

    这里抛砖引玉,为何要使用同步? 当多个线程同时操作一个可共享的资源时会出现线程安全问题,将会导致数据不一致,因此使用同步锁来防止该操作执行完之前不许被其他线程执行,从而保证了该变量的唯一性和准确性.下 ...

  6. java线程基础知识整理

    线程基本概念 1.什么是进程?什么是线程? 进程是一个应用程序,线程是一个进程中的执行场景/执行单元.一个进程可以启动多个线程.在java语言中对于两个线程A和B,堆内存和方法区内存共享.但是栈内存独 ...

  7. java 线程管理框架_实现 Java 多线程并发控制框架

    所面临的问题 图 1. 线程场景 这幅图中节点代表一个 single Thread,边代表执行的步骤. 整幅图代表的意思是,ROOT 线程执行完毕后执行 T1 线程,T1 执行完毕后并发的执行 T2 ...

  8. Java线程(二):线程同步synchronized和volatile

    上篇通 过一个简单的例子说明了线程安全与不安全,在例子中不安全的情况下输出的结果恰好是逐个递增的(其实是巧合,多运行几次,会产生不同的输出结果),为什么 会产生这样的结果呢,因为建立的Count对象是 ...

  9. java线程同步——条件对象+synchronized 关键字

    [0]README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java线程同步--条件对象+synchronized 关键字 的相关知识: 0.2)for ...

最新文章

  1. discuz 二次开发文章
  2. Python 09--多线程、进程
  3. 用pytorch及numpy计算成对余弦相似性矩阵,并用numpy实现kmeans聚类
  4. 7-2 单源最短路径 (10 分)(思路+详解+邻接表做法)Come Brather!!!!!!!!!!
  5. 如何创建Java程序
  6. Docker容器网络解析
  7. 20190903:(leetcode习题)颠倒二进制位
  8. python实现找到给定列表中满足给定和的所有子列表,元素可重复使用
  9. java数据库查询类
  10. Excel数据转化为sql脚本
  11. wifi 小米pro 驱动 黑苹果_macOS安装教程兼小米Pro安装过程记录
  12. STM32 F072RB 低功耗 开发调试
  13. 如何官网下载 IEEE 论文 Latex 和 Word 模板
  14. img 标签的 height 和 width 属性设置图像的尺寸。
  15. python投资组合有效边界,软核科普系列:用python帮你建立自己的投资组合
  16. Windows10键盘快捷键大全
  17. linux命令整理(三)
  18. 使用 Wowza IDE 开发第一个 Wowza 服务器扩展应用 -- 监控直播频道
  19. spire.xls.free操作excel简单实用
  20. linux下的lib文件

热门文章

  1. GitHub 推出安全新功能,帮助开源软件发现漏洞和机密信息
  2. 2018年《DevOps 现状报告》新鲜出炉:行业脉动与团队发展指导一览
  3. Linux服务器下LNMP安装与配置方法
  4. InflateException:Bin file line #19:Error inflating class MyTextView
  5. RedHat 7配置keepalived+LVS实现高可用的Web负载均衡
  6. Zabbix 3.0 安装部署
  7. 完整学习git三 查看暂存区目录树 git diff
  8. python学习之dict的items(),values(),keys()
  9. 与缓存有关的http-header
  10. ACM算法书籍推荐zz