首页 > 其他分享 >线程同步机制

线程同步机制

时间:2023-11-27 10:03:25浏览次数:32  
标签:同步 对象 访问 线程 监视器 机制 方法

现实生活中,我们会遇到“同一个资源,多个人想要使用”的问题,比如食堂打饭,最天然的解决办法就是排队,一个个来
处理多线程问题时,多个线程访问同一个对象,并且某些线程还想修改这个对象,这时候我们就需要线程同步,线程同步其实就是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面线程使用完毕,下一个线程再使用
由于同一个进程的多线程共享共享同一块存储空间,在带来方便的同时,也带来了访问冲突问题,为了保证数据在方法中被访问..................................时的正确性,在访问时加入锁机制synchronized,当一个线程获得对象的排他锁,独占资源,其他线程必须等待,使用后释放锁即可,存在以下问题:
一个线程持有锁会导致其他所有需要此锁的线程挂起;
在多线程竞争下,加锁,释放锁会导致比较多的上下文切换和调度延时,引起性能问题
如果一个优先级高的线程等待一个优先级低的线程释放锁会导致优先级倒置引起性能问题
由于我们可以通过private关键字来保证数据对象只能被方法访问,所以我们只需要针对方法提出一套机制,这套机制就是synchronized关键字,它包括两种用法:
synchronized方法和synchronizend块

同步方法public synchornized void method(int args){}
synchornized方法控制对“对象”的访问,每个对象对应一把锁,每个synchornized方法都必须获得调用该方法的对象的锁才能执行,否则线程会阻塞,方法一旦执行,就独占该锁,直到该方法返回才释放锁,后面被阻塞的线程才能获得这个锁,继续执行
缺陷:若将一个大的方法声明为synchrozed将会影响效率

同步块:synchorzed(Obj){}
Obj称之为同步监视器
Obj可以是任何对象,但是推荐使用共享资源作为同步监视器
同步方法中无需指定同步控制器,因为同步方法的同步监视器就是this,就是这个对象本身或者class
同步监视器的执行过程
1.第一个线程访问,锁定同步监视器,执行其中代码
2.第二个线程访问,发现同步监视器被锁定,无法访问
3.第一个线程访问完毕,解除同步监视器
4.第二个线程访问,发现同步监视器没有锁,然后锁定并访问

标签:同步,对象,访问,线程,监视器,机制,方法
From: https://www.cnblogs.com/ly123dcom/p/17858576.html

相关文章

  • 线程控制
    线程停止1.建议线程正常停止---利用次数,不建议死循环2.建议使用标志位---设置一个标志位3.不要使用stop或者destroy等,过时或者jdk不建议使用的方法线程休眠sleep,指定当前线程阻塞的毫秒数sleep存在异常InterruptedExceptionsleep时间达到后线程进入就绪状态sleep可以模拟......
  • 多线程
    1.进程和线程进程是一个应用程序线程是一个进程中执行场景,执行单元一个进程可以启动多个线程,进程与进程之间内存独立不共享2.在Java语言中:任意两个线程与线程之间,堆内存和方法区内存共享,因为对内存和方法区只有一个,但是栈内存独立,一个线程一个栈,栈内存有很多个假设有十个线程,会有......
  • 多线程2.0
    说起进程就不得不说程序。程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念而进程则是执行程序的一次执行过程,他是一个动态的概念,是系统资源分配的单位通常在一个进程中可以包含若干个线程,当然一个进程至少有一个线程,不然没有存在的意义,线程是cpu调度和执行的......
  • 守护线程
    线程分为用户线程和守护线程虚拟机必须保护用户线程执行完毕虚拟机不用等待守护线程执行完毕如,后台记录操作日志,监控内存,垃圾回收等待...Java提供一个线程调度器来监控程序中启动后进入就绪状态的所有线程,线程调度器按照优先级决定应该调度那个线程来执行线程的优先级用数字表示,范......
  • 多线程.模拟龟兔赛跑
    packageJavaSE.Thread.document01;/***模拟龟兔赛跑*/publicclassDemo05implementsRunnable{publicstaticStringwinner;//胜者@Overridepublicvoidrun(){for(inti=1;i<=100;i++){if(Thread.currentThread().getName()......
  • 线程-线程安全基础篇
    线程安全一些线程安全的容器在复合操作下可能不是线程安全的例:同步容器Vector1.Vector这样的同步容器的所有公有方法全都是synchronized的,也就是说,我们可以在多线程场景中放心的使用【单独】这些方法,因为这些方法本身的确是线程安全的2.由于,不同线程在同一时间操作同一个Vector,......
  • Java守护线程
    Java中的线程分为两类,分别为daemon线程(守护线程)和user线程(用户线程)。在JVM启动时会调用main函数,main函数所在的钱程就是一个用户线程。其实在JVM内部同时还启动了很多守护线程,比如垃圾回收线程。那么守护线程和用户线程有什么区别呢?区别之一是当最后一个非守护线程束时,JV......
  • 无涯教程-Linux - 引用机制
    在本章中,我们将详细讨论Shell引用机制。我们将从讨论元字符开始。元字符UnixShell提供了各种元字符,这些元字符在任何Shell脚本中使用时都有特殊的含义,并且除非引号引起,否则会导致终止。如,?匹配单个字符,而在目录中列出文件,而*匹配多个字符。这是大多数Shell特殊字符(也称为......
  • 进程和线程的区别
    线程(Thread)和进程(Process)是操作系统中用于执行程序的基本执行单元,它们之间有几个关键的区别:定义:进程:进程是程序的一次执行过程,是一个独立的、具有一定资源的运行环境。它包括程序计数器、寄存器集合、内存空间和其他系统资源。线程:线程是进程的一部分,是一个程序内的独立执......
  • 线程池使用示例
    概述在多线程执行任务时,可以使用线程池执行任务。相关代码如下:publicstaticvoidmain(String[]args){ThreadPoolExecutorexecutor=null;try{executor=newThreadPoolExecutor(2,3,0L,TimeUnit.MILLISECONDS,newLinkedBlockingQueue......