线程的同步(协调)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] VirtualBox复制虚拟机
环境: Oracle VM VirtualBox 5.0.20 CentOS-6.7-x86_64-minimal.iso 1.复制虚拟机 -->右击休眠状态模板虚拟机,选择复制 -->填 ...
- B. Views Matter
链接 [http://codeforces.com/contest/1061/problem/B] 题意 问你最多去掉多少块使得从上和右看,投影图不变 分析 注意细节,尤其第一列 代码 #includ ...
- Linux内核分析 读书笔记 (第四章)
第四章 进程调度 调度程序负责决定将哪个进程投入运行,何时运行以及运行多长时间.进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统.只有通过调度程序的合理调度,系统资源才能最大限 ...
- 《Linux内核设计与实现》读书笔记 5
第五章系统调用 5.1与内核通信 系统调用在用户空间进程和硬件设备间添加了一个中间层, 作用:为用户空间提供了一种硬件的抽象接口:保证了系统的稳定和安全,避免应用程序不正确使用硬件,窃取其他进程的资源 ...
- Chrome查看HTTP
查找cookie 补充: 接口调试使用postman挺不错的.以前每次都自己写一个ajax来进行接收调试. 如:用post发送json数据给接口,得到json数据. 工具有时候能让效率大大提升,要学会 ...
- CAS的应用场景
国外应用(需FQ尝试): 来自CAS官网推荐的Demo http://casserver.herokuapp.com/cas/login https://casserver.herokuapp.com ...
- [转帖]知乎专栏:正确使用 Docker 搭建 GitLab 只要半分钟
正确使用 Docker 搭建 GitLab 只要半分钟 https://zhuanlan.zhihu.com/p/49499229 很多程序员在内网搭建 gitlab 都搭建的坑坑洼洼,不支持 htt ...
- PHP 4种输出的方式
<?php //测试用的数组 $info = array('11'=>'aaa', '22'=>'bbb', '33'=>'ccc'); //第一种,将整个数组作为一个对象输出 ...
- ElasticSearch 6.x head插件安装
一.下载node.js yum install -y nodejs 二.安装npm npm install -g cnpm --registry=https://registry.npm.taobao ...
- python之tkinter使用-多选框实现开关操作
# tkinter的Checkbutton实现开关操作 import tkinter as tk root = tk.Tk() root.title('开关') root.geometry('170x ...