首页 > 其他分享 >多线程-线程安全-同步代码块

多线程-线程安全-同步代码块

时间:2022-10-17 10:35:29浏览次数:64  
标签:同步 Thread 对象 代码 多线程 线程 执行

线程安全问题产生的原理

出现了线程安全问题 卖票出现了重复的票

图解

 线程同步

当我们使用多个线程访问同一个资源的时候 且多个线程对资源有写的操作 就容易出现线程安全问题

要解决上诉多线程并发访问一个资源的安全性问题 也就是解决重复票 java中提供了同步机制

(synchronized)来解决

有三种方法来完成同步操作:

1.同步代码块

2.同步方法

3.锁机制

同步代码块

同步代码块:synchronized关键字可以用于方法中的某个区块中 表示这个区块的资源实现互斥访问

格式:

synchronized(同步锁){
        需要同步操作的代码
}

同步锁:

对象的同步锁只是一个感念 可以想象为在对象上标记了一个锁

1.锁对象 可以是任意类型

2.多个线程对象 要使用同一把锁

注意:在任何时候 最多允许一个线程拥有同步锁 谁拿到锁就进入代码块 其他的线程只能在外等着

锁对象作用:把同步代码块锁住 只让一个线程在同步代码块中执行

代码:

package demo19;

public class DemoSynchronized implements Runnable {
//定义一个多个线程共享的票源
private int ricket=100;
//创建锁对象
Object obj = new Object();

//设置线程任务:卖票
@Override
public void run() {
//使用死循环 让卖票操作重复执行
while (true){

//同步代码块
synchronized (obj){
//加入线程休眠
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
//先判断票是否存在
if (ricket==0){
break;
}

//票存在 买票 ticket--
System.out.println(Thread.currentThread().getName()+"--->正在买第"+ricket+"张票");
ricket--;
}
}
}
}

class test07{
public static void main(String[] args) {
//创建实现类对象
DemoSynchronized ticket = new DemoSynchronized();
//实现线程执行
/*
因为有两张售票口所有要进行出售
*/
new Thread(ticket).start();
new Thread(ticket).start();
}
}

运行结果:‘

 同步锁的原理:

使用了一个锁对象 这个锁对象叫做同步锁 也叫对象锁  也叫对象监视器

2个线程一起抢夺cpu的执行权 谁抢到了谁执行run方法进行买票

比如:

  • 第一个线程抢到了cpu的执行权 执行run方法 遇到代码块这时第一个线程会检查同步代码块是否有锁对象
    • 发现有就会获取锁对象 进入到同步中执行
  • 第二个线程抢到了cpu的执行权 执行run方法 遇到代码块 这时第二个线程会检查同步代码块是否有锁对象
    • 发现没有 就会进入堵塞状态 会一直到第一个线程执行完将锁对象还给同步代码块时 第二个线程才执行
总结:同步中的线程 没有执行完毕不会释放锁 同步外的线程没有锁进不去同步

标签:同步,Thread,对象,代码,多线程,线程,执行
From: https://www.cnblogs.com/shenziyi/p/16798237.html

相关文章

  • 多线程-线程安全-同步方法
    同步方法使用synchronized修饰的方法就叫做同步方法保证A线程执行该方法的时候其他线程只能在方法外等着格式:publicsynchronizedvoidmethod(){可能......
  • 多线程-线程安全问题-lock锁
    lock锁lock机制提供了比synchronized代码块和synchronized方法更广泛的锁定操作同步代码块/同步方法具有的功能lock都有除此之外更强大更体面面向对象lock隶属于jav......
  • 多线程-并发和并行和线程与进程
    并发和并行并发:指两个或者多个事件在同一个时间段内发生并行:值两个或者多个事件在同一时刻发生(同时发生) 更详细的图解:线程和进程进程基本介绍是指一个内存中运......
  • 多线程—线程
    线程的概念cpu:中央处理器对数据进行计算指挥电脑中的软件和硬件干活cpu的分类AMDInterInterCore(核心)i788664核心8线程8线程:同时执行8个任务图解: ......
  • 多线程-创建线程类
    java使用Thread类代表线程所有线程对象都必须时Thread类或者其子类的实例每个线程的作用是完成一定的任务实际上就是执行一段程序流即一端顺序执行的代码java使用线程......
  • rsync同步SQLite3文件API返回旧数据
    问题描述EFCorecannotgetnewvalueindocker,ifusersyncreplacesqlitefile基于.NET6开发一个查询SQLite的API,使用Docker进行部署,通过挂载的方式来访问数据库文......
  • 操作系统实验:同步机制及应用编程实现与比较——银行转账问题
    1.实验内容及要求针对所谓的银行账户转账同步问题,分析、设计和利用C语言编程实现基于Peterson算法的同步解决方案,以及基于Windows(或Linux)操作系统同步机制的相应解......
  • 操作系统实验:多进程、IPC进程间通信、线程间通信
      SHANGHAI UNIVERSITY操作系统(一)实验报告 组   号第4组学号姓名20120889曹中阳实验序号实验三日期2022年9月10日......
  • 驱动开发:内核枚举驱动内线程(答疑篇)
    这篇文章比较特殊,是一篇穿插答疑文章,由于刚好在前一篇教程《驱动开发:内核枚举PspCidTable句柄表》整理了枚举句柄表的知识点,正好这个知识点能解决一个问题,事情是这样的有一......
  • mysql 利用federated同步远程数据表
    需要做是是将A的数据表同步到B数据表中,A数据表和B数据表属于两个数据库,并且存在异地。1.首先在B端数据库开启federated,数据库默认是关闭的,在数据库配置文件中(my.cnf)的[mys......