代表这个方法加锁,相当于不管哪一个线程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. Find cmd

    Find cmd with python programing python at page320 Unix find cmd: find . -name "*.py " -pri ...

  2. Javascript 中判断对象为空

    发现了一个巧妙的实现: 需要检查一个对象(Object)是否为空,即不包含任何元素.Javascript 中的对象就是一个字典,其中包含了一系列的键值对(Key Value Pair).检查一个对象是 ...

  3. charles 之 ssl proxy 设置(https抓包)

    PC端设置 1.启动Charles软件,在菜单中找到 Help -> SSL Proxying ->Install Charles Root Certificate. 2.菜单中找到 pr ...

  4. CentOS下搭建LAMP环境详解

    前言:在这里将介绍如何在CentOS下搭建LAMP环境(全部使用源码编译安装),用于web服务器开发. •LAMP: Linux + Apache + PHP + Mysql. •系统: CentOS ...

  5. Ansible 学习笔记

    最近因为需要管理很多台机器,而这些机器又需要频繁重新安装,实在受不了Puppet需要在每个客户机上都安装一遍,于是转头开始学些Ansible.根据这段时间的使用,这个确实是神器,唯一的感觉就是相见恨晚 ...

  6. 通过cygwin安装openSSH

    openSSH的安装是学习hadoop必不可少的一步,如果ssh装不好,hadoop的安装会进行不下去.本人初学hadoop时发现以前安装ssh走了一些弯路,现在又有了一些认识,所以重写了这篇日志,供 ...

  7. js 小数相加

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat=&qu ...

  8. C++文件流类与文件流对象

    文件流是以外存文件为输入输出对象的数据流.输出文件流是从内存流向外存文件的数据,输入文件流是从外存文件流向内存的数据.每一个文件流都有一个内存缓冲区与之对应. 请区分文件流与文件的概念,不用误以为文件 ...

  9. [转载] 不查资料确定int型整数的最大值和最小值

    原文地址:http://blog.csdn.net/zhanghuoding/article/details/42719213 想法来自于书中的习题. Java的话直接输出 Integer.MAX_V ...

  10. [摘]在ASP.NET MVC中使用DropDownList

    在ASP.NET MVC中,尽管我们可以直接在页面中编写HTML控件,并绑定控件的属性,但更方便的办法还是使用HtmlHelper中的辅助方法.在View中,包含一个类型为HtmlHelper的属性H ...