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

JAVA多线程买票案例

synchronized 同步

用synchronized 块实现同步

    public static void main(String[] args) {
// runable对象的属性代表了一共多少张票
// runable对象的run方法实现了买票的动作
Runnable runnable = new Runnable() {
private int count = 100;
@Override
public void run() {
while (true) {
synchronized (this) { // synchronized 的对象如果
Thread currentThread = Thread.currentThread();
if (count > 0) {
out.println(currentThread.getName()+ " => " + (101 - count) + "张车票");
--count;
} else {
break;
}
}
}
}
}; // 开启100个线程模拟100个售票口
for (int i = 0; i < 100; i++) {
new Thread(runnable).start();
}
}

用synchronized 方法 块实现同步

    public static void main(String[] args) {
// runable对象的属性代表了一共多少张票
// runable对象的run方法实现了买票的动作
Runnable runnable = new Runnable() {
private int count = 100; @Override
public void run() {
while (true) {
if (synchronizedMethod()) break;
}
} public synchronized boolean synchronizedMethod() {
Thread currentThread = Thread.currentThread();
if (count > 0) {
out.println(currentThread.getName() + " => " + (101 - count) + "张车票");
--count;
return false;
}
return true;
}
}; // 开启100个线程模拟100个售票口
for (int i = 0; i < 100; i++) {
new Thread(runnable).start();
}
}

同步过后的代码输出如下

Thread-0 => 1张车票
Thread-0 => 2张车票
Thread-0 => 3张车票
Thread-4 => 4张车票
Thread-4 => 5张车票
Thread-2 => 6张车票
....
....
Thread-34 => 98张车票
Thread-34 => 99张车票
Thread-34 => 100张车票

非同步

synchronized 块

把同步块删除

synchronized 方法

把 ynchronized 关键字删除

输出结果如下

Thread-0 => 1张车票
Thread-0 => 2张车票
Thread-2 => 1张车票
Thread-2 => 4张车票
Thread-2 => 5张车票
Thread-2 => 6张车票
Thread-2 => 7张车票
Thread-4 => 7张车票
Thread-1 => 1张车票
Thread-1 => 10张车票
Thread-1 => 11张车票
Thread-1 => 12张车票
Thread-1 => 13张车票

可以看出有一个以上的线程访问同一张票
显然是不合理的

Java多线程同步 synchronized 关键字的使用的更多相关文章

  1. Java多线程-同步:synchronized 和线程通信:生产者消费者模式

    大家伙周末愉快,小乐又来给大家献上技术大餐.上次是说到了Java多线程的创建和状态|乐字节,接下来,我们再来接着说Java多线程-同步:synchronized 和线程通信:生产者消费者模式. 一.同 ...

  2. java多线程中synchronized关键字的用法

    转自:http://www.cdtarena.com/javapx/201308/9596.html 由于同一进程内的多个线程共享内存空间,在Java中,就是共享实例,当多个线程试图同时修改某个实例的 ...

  3. 多线程编程-- part 3 多线程同步->synchronized关键字

    多线程同时访问一个资源,可以会产生不可预料的结果,所以为这个资源加锁,访问资源的第一个线程为其加锁后,其他线程便不能在使用那个资源,直到锁被解除. 举个例子: 存款1000元,能取出800的时候我就取 ...

  4. Java多线程:synchronized关键字和Lock

    一.synchronized synchronized关键字可以用于声明方法,也可以用来声明代码块,下面分别看一下具体的场景(摘抄自<大型网站系统与Java中间件实践>) 案例一:其中fo ...

  5. Java自学-多线程 同步synchronized

    Java 多线程同步 synchronized 多线程的同步问题指的是多个线程同时修改一个数据的时候,可能导致的问题 多线程的问题,又叫Concurrency 问题 步骤 1 : 演示同步问题 假设盖 ...

  6. java 轻量级同步volatile关键字简介与可见性有序性与synchronized区别 多线程中篇(十二)

    概念 JMM规范解决了线程安全的问题,主要三个方面:原子性.可见性.有序性,借助于synchronized关键字体现,可以有效地保障线程安全(前提是你正确运用) 之前说过,这三个特性并不一定需要全部同 ...

  7. “全栈2019”Java多线程第十六章:同步synchronized关键字详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  8. Java多线程---同步与锁

    一,线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 二.同步和锁定 1.锁的原理 Java中每个对象都有一个内置锁. 当程序运行到非静态的synchronized同步方法上时,自动 ...

  9. 转:关于JAVA多线程同步

    转:http://lanvis.blog.163.com/blog/static/26982162009798422547/ 因为需要,最近关注了一下JAVA多线程同步问题.JAVA多线程同步主要依赖 ...

随机推荐

  1. Android 自定义view(二) —— attr 使用

    前言: attr 在前一篇文章<Android 自定义view -- attr理解>已经简单的进行了介绍和创建,那么这篇文章就来一步步说说attr的简单使用吧 自定义view简单实现步骤 ...

  2. Android tween 动画 XML 梳理

    前言: Tween动画是展现出旋转.渐变.移动.缩放的这么一种转换过程,即补间动画.Tween动画有两种定义方式:XML形式,编码形式.这次主要来梳理XML的方式配置动画 (1)XML定义动画,按照动 ...

  3. Java找不到或无法加载主类

    今天用cmd运行一下java出现了找不到或无法加载主类 的问题 javac编译可以通过   java运行不了 原因: 看一下java版本 看一下javac版本: 编译和运行环境的版本不一样报错原来是用 ...

  4. 敏捷项目开源管理软件ScrumBasic(1)

    ScrumBasic 是本人基于Asp.net mvc6 最新的core 1.0写的一个敏捷项目管理软件. 目前只是一个基础版本的功能.只支持1个project. 后期会在这个基础上做扩展和权限管理. ...

  5. html5,音频代码

    <!-- <audio src="1.mp3" controls="controls"></audio> -->    &l ...

  6. 学习笔记:MySQL字符串类型

    字符串类型 a)         char和varchar 1.都需要指定字符的长度,char中的长度是字符的长度,而varchar的长度是字节的长度 2. char中指定的长度就是实际占用的长度,而 ...

  7. js 中关键字 this的用法

    <1>  js中this 的用法?  (key:函数是由调用的,四种情况标红可知) (http://www.ruanyifeng.com/blog/2010/04/using_this_k ...

  8. C语言三维数组分解

    很多人在学习C的时候,感觉三维数组很难想象,而且不理解深度是什么?做了一个图,帮大家分解一下                                                       ...

  9. Bitnami Redmine插件记录

    1.bitnami安装时自带了开发环境,如ruby.rails.devkit. 为了版本兼容,应使用bitnami的命令行. 2.通过use_redmine启动命令行:运行Bitnami\redmin ...

  10. Cortex-M3中C与汇编的交互

          以下内容摘自<ARM Cortex-M3权威指南>         概览       在CM3 上编程,既可以使用C 也可以使用汇编.可能还有其它语言的编译器,但是大多数人还是 ...