线程同步,为什么要引入线程同步?

多个线程同时访问共享资源时候,如果没有先来后到,可能造成结果的不可再现性,使得结果背离预期的结果,例如多人抢少量票,银行取钱等.

线程同步的实现是依靠队列和锁来实现的

java中的锁有两种

  • Syschronized同步锁,既可以修饰同步代码块,也可以去修饰方法,默认的钥匙是this的类对象.
package ThreadDemo2;public class TicketThread extends Thread{static int num=10000;@Overridepublic void run() {while(true) {if (num>0){ticket();}else {break;}}try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}}public static synchronized void ticket(){    //线程同步锁 System.out.println(Thread.currentThread().getName()+"出票"+num);num--;}}
  • Lock锁, 只能给同步代码块加锁, 不能给方法加锁.手动开启和关闭,在需要同步代码结束的时候进行关闭.
package ThreadDemo3;import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;public class LockDemo1 implements Runnable {static int num=10;Lock lock = new ReentrantLock();@Overridepublic void run() {while(true){try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}lock.lock();           //给线程加锁  if (num<=0){System.out.println("票已经卖光了!!!");break;}else {System.out.println(Thread.currentThread().getName()+":出票编号"+num);num--;}lock.unlock();        //手动关锁}}
}package ThreadDemo3;import java.util.concurrent.locks.Lock;public class LockTest1 {public static void main(String[] args) {LockDemo1 lockDemo1 = new LockDemo1();Thread thread1 = new Thread(lockDemo1,"窗口1");Thread thread2 = new Thread(lockDemo1,"窗口2");Thread thread3 = new Thread(lockDemo1,"窗口3");thread1.start();thread2.start();thread3.start();}
}

关于线程造成的一些问题会在其他文章中展示

线程同步,为什么要引入线程同步?相关推荐

  1. 线程状态切换之等待队列和同步队列

    转自:https://blog.csdn.net/weixin_37695911/article/details/106668435 线程的主要状态及切换: 1.初始-NEW(还未调用start()) ...

  2. Python|线程和进程|阻塞|非阻塞|同步|异步|生成器和协程|资源竞争|进程间通信|aiohttp库|daemon属性值详解|语言基础50课:学习(11)

    文章目录 系列目录 原项目地址 第34课:Python中的并发编程-1 线程和进程 多线程编程 使用 Thread 类创建线程对象 继承 Thread 类自定义线程 使用线程池 守护线程 资源竞争 G ...

  3. 线程的状态、调度、同步

    线程的状态 java中的线程共五个状态:新建.就绪.运行.阻塞.死亡: 新建状态(New):处于系统创建线程,但未启动此线程,系统未为其分配资源. 就绪状态(Runnable):线程调用start( ...

  4. java 同步转并行_Java线程与并行编程(二)

    你好,我是goldsunC 让我们一起进步吧! 线程的控制与同步 线程的状态与生命周期 '每个Java程序都有一个默认的主线程,想要实现多线程,必须在主线程中创建新的线程对象.新建的线程在它的一个完整 ...

  5. c++ linux 线程等待与唤醒_Linux线程同步(互斥量、信号量、条件变量、生产消费者模型)...

    为什么要线程同步? 线程间有很多共享资源,都对一个共享数据读写操作,线程操作共享资源的先后顺序不确定,可能会造成数据的冲突 看一个例子 两个线程屏行对全局变量count++ (采用一个val值作为中间 ...

  6. python 线程同步_Python并发编程-线程同步(线程安全)

    Python并发编程-线程同步(线程安全) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 线程同步,线程间协调,通过某种技术,让一个线程访问某些数据时,其它线程不能访问这些数据,直 ...

  7. Java20-day11【实现多线程(进程、线程-调度-控制-生命周期)、线程同步(同步代码块、线程安全、Lock)、生产者消费者(模式概述、案例)】

    视频+资料[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] Java基础--学习笔记(零起点打开java世界的大门)--博 ...

  8. Go线程安全:我们不用考虑同步的问题 不用考虑数据污染的情况

    概念 在拥有共享数据的多条线程并行执行的程序中, 线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行, 不会出现数据污染等意外情况. 分类 不可变类:原子性的 不可变的线程安全性类:也是不 ...

  9. 同步代码块解决线程安全

    案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果. 代码: package com.learn;class ThreadDemo01 implements Runnab ...

最新文章

  1. 多线程:pthread_cond_wait 实现原理
  2. 公司网络问题----------网络设备老化的问题
  3. 扫地机器人“离家出走”的真实原因找到了:差个自动驾驶算法
  4. php执行rsync,使用rsync工具构建php项目管理平台,rsync项目管理
  5. 微信小程序从oracle取数,微信小程序 取随机数
  6. 视频流传输协议RTP/RTCP/RTSP/HTTP的区别
  7. python重复元素判定_30段极简Python代码:这些小技巧你都Get了么
  8. python beautifulreport_Python unittest 之 BeautifulReport可视化报告
  9. chrome本地文件加载跨域请求
  10. Python创建多线程(join线程同步)
  11. 人物传记——周小川、李稻葵(央行智囊团)
  12. 高并发架构系列:分布式锁的由来、特点及Redis分布式锁的实现详解
  13. LINUX中文件的移动,Linux中文件移动文件的操作命令为 ()
  14. 管家婆仓库管理软件到底选哪个好?
  15. 关于.dll文件的注册,如何注册.dll文件
  16. 《Redis视频教程》(p17)
  17. 好系统重装助手教你win10系统连接XP系统共享打印机的方法
  18. 百度地图LBS开放平台AK一直没有用
  19. 九爷带你了解 nginx优化
  20. 华为多屏互动看学英语

热门文章

  1. phpstyudy端口被占用怎么办
  2. ROS IDE —— RoboWare Studio
  3. 【Jmeter】jmeter的安装与启动(win10)
  4. JDBC链接中的问题
  5. 《程序设计基础》 第十章 函数与程序结构 6-5 递归求简单交错幂级数的部分和 (15 分)
  6. Gradle Composite builds 扩展使用
  7. 查看linux服务器的品牌和型号
  8. 分享几个去图片水印好用的软件给你
  9. 大学计算机网络技术基础--笔记大全
  10. Socket在iOS客户端上的简单实现 - 利用GCAsyncSocket框架