线程的同步(协调)synchronized
【格式】
同步代码块: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的更多相关文章
- 线程的同步之Synchronized的使用
一.介绍 线程的同步:一般的并发指的就是多个线程访问同一份资源.多个线程同时访问(修改)同一份资源的话,就会有可能造成资源数据有误. 如果多个线程访问多个不同资源,就不会造成线程同 ...
- 线程的同步之Synchronized在单例模式中的应用
synchronized在单例模式中的使用 在单例模式中有一种懒汉式的单例,就是类初始化的时候不创建对象.等第一次获取的时候再创建对象.这种单例在单线程下是没有问题的获取的也都是同一个对象.但是如果放 ...
- JAVA之旅(十三)——线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this
JAVA之旅(十三)--线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this 我们继续上个篇幅接着讲线程的知识点 一.线程的安全性 当我们开启四个窗口(线程 ...
- Java基础-多线程-③线程同步之synchronized
使用线程同步解决多线程安全问题 上一篇 Java基础-多线程-②多线程的安全问题 中我们说到多线程可能引发的安全问题,原因在于多个线程共享了数据,且一个线程在操作(多为写操作)数据的过程中,另一个线程 ...
- Java:多线程,线程同步,synchronized关键字的用法(同步代码块、非静态同步方法、静态同步方法)
关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨synchronized关键字. sy ...
- Java多线程之线程同步【synchronized、Lock、volatitle】
线程同步 线程同步:当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态,实现线程同步的方法有很多. ...
- java thread 线程锁同步,锁,通信
12.线程同步 当多个线程访问同一个数据时,非常容易出现线程安全问题.这时候就需要用线程同步 Case:银行取钱问题,有以下步骤: A.用户输入账户.密码,系统判断是否登录成功 B.用户输入取款金额 ...
- Java多线程的同步机制(synchronized)
一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在 java里边就是拿到某个同步对象的锁(一个对象只有一把锁): 如果这个时候同步对象的锁被其他线程拿走了,他(这个 ...
- (1)线程的同步机制 (2)网络编程的常识 (3)基于tcp协议的编程模型
1.线程的同步机制(重点)1.1 基本概念 当多个线程同时访问同一种共享资源时可能会造成数据的覆盖和不一致等问题,此时就需要对线程之间进行协调和通信,该方式就叫线程的同步机制. 如: 2003年左右 ...
- java语言进阶(六)_线程_同步
第一章 多线程 想要设计一个程序,边打游戏边听歌,怎么设计? 要解决上述问题,需要使用多进程或者多线程来解决. 1.1 并发与并行 并发:指两个或多个事件在同一个时间段内发生. 并行:指两个或多个事件 ...
随机推荐
- Linux内核分析——ELF文件格式分析
ELF文件(目标文件)格式主要三种: 1)可重定向文件:文件保存着代码和适当的数据,用来和其他的目标文件一起来创建一个可执行文件或者是一个共享目标文件.(目标文件或者静态库文件,即linux通常后缀为 ...
- QQ通信机制(转)
下面有4个基本的问答: 问题一:为什么只要可以连上互联网的计算机都可以用QQ相互建立通信,而不需要固定IP?也就是这个QQ用户端是怎样找到另一个QQ用户的,而用户在每次使用时他可能用的是不同的计算机, ...
- HanderBar
对于java开发,涉及到页面展示时,比较主流的有两种解决方案: 1. struts2+vo+el表达式. 这种方式,重点不在于struts2,而是vo和el表达式,其基本思想是:根据页面需要的信息,构 ...
- shell脚本--continue、break
shell中的continue和break和其他语言中的使用方法一模一样:continue用于跳过本次循环,break用于中断本层的循环 下面是使用例子: #!/bin/bash #文件名:test. ...
- HDU 2021 发工资咯:)
http://acm.hdu.edu.cn/showproblem.php?pid=2021 Problem Description 作为杭电的老师,最盼望的日子就是每月的8号了,因为这一天是发工资的 ...
- JavaScript全局变量的本质及页面共享问题
https://zhidao.baidu.com/question/1668225805834130107.html 全局变量默认为window的成员,window即代表浏览器窗口 全局变量均为win ...
- Spring源码阅读学习一
昨天抽时间阅读Spring源码,先从spring 4.x的core包开始吧,除了core和util里,首当其冲的就是asm和cglib. 要实现两个类实例之间的字段的复制功能: 多年之前用C#,因为阅 ...
- 快速简化Android截屏工作
1.安装Notepad++v6.9 2.插件管理器里Plugin Manager安装AndroidLogger 3.AndroidLogger里的capture功能抓取Android的当前屏幕截图到w ...
- [安全]appscan 使用代理抓取其他客户端的请求
自己安全测试技能很低, 上级给的安全测试的任务给了自动化组的同事来做, 自己之前使用appscan的时候 只知道使用appscan的内置浏览器测试抓取请求 今天与自动化美女同事沟通发现有一个代理的功能 ...
- pandas聚合aggregate
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/5/24 15:03 # @Author : zhang chao # @Fi ...