【格式】

同步代码块:synchronized(Object){...} 关键字在代码块前,每次只允许一个线程调用此代码块。

Object为任何对象(一般用this),每个对象都有一个标志位(0锁住状态,1锁打开状态)。

同步方法:synchronized void method(){...} 关键字在方法前,每次只允许一个线程调用此方法

【使用场景】

多线程访问同一资源时,为防止产生冲突,使用synchronized对该资源(方法、代码块)加锁。

理解为:多人上同一个厕所,synchronized是门上的锁(0闭、1开)。一个线程运行到synchronized处,要观察锁的状态,如果闭(里面有人在使用),在门口继续等待。当锁为开(里面的运行完毕),则此线程进入使用,并锁上。

【Runnable接口】

使用Runnable接口管理多线程:如果不使用同一个接口,则每个线程对象new各自的接口,那么会产生多个厕所(下列中的num数据池),每人一个。脱离了多线程访问同一资源的范畴。

【条件语句】

if条件尽量前置,否则,先执行再判断。

【举例】:通过不同方式购买车票后,查询余票数目。3个线程:手机电脑端、柜台、自助售票机

class MyThreadRunnalbe implements Runnable {
int num = 10;//车票总数 public void run() {//线程要执行的任务
while (true) {
synchronized (this) {//同步(协调)代码块,加锁
if (num > 0) {//条件尽量前置
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "购买,余票:" + num--);
} else break;
}
}
}
} public class Demo {
public static void main(String[] args) {
MyThreadRunnalbe mtr = new MyThreadRunnalbe();//创建端口对象(以下3个线程共同使用这1个端口)
Thread tA = new Thread(mtr, "手机电脑端");// 以该类对象分别实例化4个线程
Thread tB = new Thread(mtr, "柜台");
Thread tC = new Thread(mtr, "自助售票机");
// //不可以分别new MyThreadRunnalbe(),3个接口使得3个线程各自执行,无法达到有序的目的
// Thread tA = new Thread(new MyThreadRunnalbe(), "手机电脑端");
// Thread tB = new Thread(new MyThreadRunnalbe(), "柜台");
// Thread tC = new Thread(new MyThreadRunnalbe(), "自助售票机");
tA.start();// 分别启动线程
tB.start();
tC.start();
}
}

或者,同步(协调)方法sell()

class MyThreadRunnalbe implements Runnable {
int num = 10;//车票总数 public void run() {//线程要执行的任务
while (true) {
sell();//调用sell方法
if (num <= 0) break;
}
} public synchronized void sell() {//创建sell方法,并同步(协调) if (num > 0) {//条件尽量前置
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + "购买,余票:" + num--);
}
}
} public class Demo {
public static void main(String[] args) {
MyThreadRunnalbe mtr = new MyThreadRunnalbe();//创建端口对象(以下3个线程共同使用这1个端口)
Thread tA = new Thread(mtr, "手机电脑端");// 以该类对象分别实例化4个线程
Thread tB = new Thread(mtr, "柜台");
Thread tC = new Thread(mtr, "自助售票机");
// //不可以分别new MyThreadRunnalbe(),3个接口使得3个线程各自执行,无法达到有序的目的
// Thread tA = new Thread(new MyThreadRunnalbe(), "手机电脑端");
// Thread tB = new Thread(new MyThreadRunnalbe(), "柜台");
// Thread tC = new Thread(new MyThreadRunnalbe(), "自助售票机");
tA.start();// 分别启动线程
tB.start();
tC.start();
}
}

线程的同步(协调)synchronized的更多相关文章

  1. 线程的同步之Synchronized的使用

       一.介绍        线程的同步:一般的并发指的就是多个线程访问同一份资源.多个线程同时访问(修改)同一份资源的话,就会有可能造成资源数据有误. 如果多个线程访问多个不同资源,就不会造成线程同 ...

  2. 线程的同步之Synchronized在单例模式中的应用

    synchronized在单例模式中的使用 在单例模式中有一种懒汉式的单例,就是类初始化的时候不创建对象.等第一次获取的时候再创建对象.这种单例在单线程下是没有问题的获取的也都是同一个对象.但是如果放 ...

  3. JAVA之旅(十三)——线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this

    JAVA之旅(十三)--线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this 我们继续上个篇幅接着讲线程的知识点 一.线程的安全性 当我们开启四个窗口(线程 ...

  4. Java基础-多线程-③线程同步之synchronized

    使用线程同步解决多线程安全问题 上一篇 Java基础-多线程-②多线程的安全问题 中我们说到多线程可能引发的安全问题,原因在于多个线程共享了数据,且一个线程在操作(多为写操作)数据的过程中,另一个线程 ...

  5. Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)

    关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...

  6. Java多线程之线程同步【synchronized、Lock、volatitle】

    线程同步 线程同步:当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,实现线程同步的方法有很多. ...

  7. java thread 线程锁同步,锁,通信

    12.线程同步 当多个线程访问同一个数据时,非常容易出现线程安全问题.这时候就需要用线程同步 Case:银行取钱问题,有以下步骤: A.用户输入账户.密码,系统判断是否登录成功 B.用户输入取款金额 ...

  8. Java多线程的同步机制(synchronized)

    一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在 java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个 ...

  9. (1)线程的同步机制 (2)网络编程的常识 (3)基于tcp协议的编程模型

    1.线程的同步机制(重点)1.1 基本概念 当多个线程同时访问同一种共享资源时可能会造成数据的覆盖和不一致等问题,此时就需要对线程之间进行协调和通信,该方式就叫线程的同步机制. 如: 2003年左右 ...

  10. java语言进阶(六)_线程_同步

    第一章 多线程 想要设计一个程序,边打游戏边听歌,怎么设计? 要解决上述问题,需要使用多进程或者多线程来解决. 1.1 并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件 ...

随机推荐

  1. jsp获取传过来的值

    request.setCharacterEncoding("utf-8"); String credit=request.getParameter("credit&quo ...

  2. Sprint 冲刺第三阶段第二天

    陈汝婷:播放音乐 1:做播放音乐这个功能时开始没有考虑周全,使用 PS P出来的图竟然没有用上,耗时耗人工.吃一见长一智,以后要考虑周全.还要耗了那么久,音乐的初效果终于出来了. 2:昨天出现的问题, ...

  3. tensorflow win10 系统下安装

    安装tensorflow gpu版本 Step1 安装CUDA8.0 进入这个云盘地址下载,密码5aoc 进行CUDA8.0下载.下载完成后解压,打开exe文件直接按照默认进行安装,安装步骤比较繁琐, ...

  4. AWK学习一例

    awk 'BEGIN { for (i = 1; i <= 7; i++) print int(101 * rand()) }'

  5. Docker 安装私有镜像库的简单使用

    公司的网络实在是太差了, 想着自己搭建一个私有的镜像库进行使用测试使用.... docker pull registry.docker-cn.com/library/registry docker t ...

  6. windows下git显示文件被修改,实际没有改动的问题解决办法

    不少开发者可能遇到过这个问题:从git上拉取服务端代码,然后只修改了一处地方,准备提交时,用diff软件查看,却发现整个文件都被修改了.这是git自动转换换行符导致的问题. 原因 不同操作系统使用的换 ...

  7. 如何为TreeView定义三层模板并实现数据绑定

    一直以来都想对TreeView定义多层模板,并实现数据绑定做一个总结,今天在这里做一个概述,我们常用的两层的TreeView绑定的话,我们首先修改TreeView的模板,这里我们使用的是级联的数据模板 ...

  8. timescale 时间尺度

    1 `timescale为模块指定参考时间单位 `timescale<reference_time_unit>/<time_precision> 2 module endmou ...

  9. CentOS_7 网络配置(临)

    https://www.cnblogs.com/kouryoushine/p/8011978.html 先转载一个,找个时间详细写一下

  10. BZOJ5101[POI2018]Powódź——并查集

    题目描述 在地面上有一个水箱,它的俯视图被划分成了n行m列个方格,相邻两个方格之间有一堵厚度可以忽略不计的墙,水 箱与外界之间有一堵高度无穷大的墙,因此水不可能漏到外面.已知水箱内每个格子的高度都是[ ...