【格式】

同步代码块: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. python语言几个常见函数的使用

    写代码,有如下变量,请按照要求实现每个功能: name = " Kobe Bean Bryant" a. 移除 name 变量对应的值左边的空格,并输出移除后的内容 name = ...

  2. SQLserver 进程被死锁问题解决

    事务(进程ID xx)与另一个进程被死锁在 锁|通信缓冲区 资源上,并且已被选座死锁牺牲品.请重新运行该事务.Sqlserver 当出现这个错误时,如下图: 解决办法:更改数据库事务隔离级别 alte ...

  3. MySQL存储和获取数据

    ---恢复内容开始--- 一.MySQL存储引擎? 1.引擎定义 存储引擎其实就是如何存取数据,如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在关系型数据苦中数据是以表格的形式,所 ...

  4. ajax 异步请求 代码

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  5. What is the difference between apache tomcat deployer and core version? - Stack Overflow

    java - What is the difference between apache tomcat deployer and core version? - Stack Overflowhttps ...

  6. Robot Framework 入门教程总结

    Robot Framework 作为一款通用测试框架,可加载多种测试库.驱动多种测试工具,并可对各种自定义脚本进行集成.对于Robot Framework,我准备将其分为 入门--Robot Fram ...

  7. windows 与linux 上面PG的简单验证

    0.0 目的 验证一下 windows 上面 和linux上面的数据文件是否可以 冷备份 恢复. 1 方法关闭 windows机器上面postgresql 的服务 我这边是PG10.4 可以使用命令 ...

  8. [转帖]CR3,PDE,PTE,TLB 内存管理的简单说明

    CR3,PDE,PTE,TLB  Copy From https://www.cnblogs.com/zzSoftware/archive/2013/02/11/2908824.html   网上关于 ...

  9. hive数据导入Sqoop工具

    下载Sqoop ,直接解压缩;然后导入2个环境变量 1.导入oracle数据库中表emp的数据到hive表中 1.导入到HDFS中 $ sqoop import --connect jdbc:mysq ...

  10. jquery Ajax noConflict()

    如果幾個框架都在使用$作為標識符,那麼這個時候可以使用noConflict()處理衝突. 可以直接使用jquery代替簡寫,也可以定義變量,也可以將$賦值給ready函數,函數內部可以使用快捷方式,不 ...