`
newspringwork
  • 浏览: 101354 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

Java线程-同步与锁

 
阅读更多

1.线程简介

线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏

 

2.锁的原理

Java中每个对象都有一个内置锁。

当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行代码类的当前实例(this实例)有关的锁。获得一个对象的锁也称为获取锁、锁定对象、在对象上锁定或在对象上同步。

关于锁和同步,有一下几个要点:

  • 每个对象只有一个锁,提到同步时因该清楚在哪个对象上同步
  • 每个对象只有一个锁,一个同步方法A获得锁后,其他线程无法获得这个实例的任何(方法A以及其他的)同步方法同步块(同步块的锁也是该实例)
  • 一个线程进入同步方法A后,不影响其他线程调用该实例的非同步方法,即非同步方法不受锁的限制
  • 只能同步方法,而不能同步变量和类
  • 线程睡眠不会施放任何锁
  • 线程可以获得多个锁,如同个线程同步方法中调用另外一个对象的同步方法,这时就获取了两个对象的锁,需防止死锁
  • 同步损害并发性,应该尽可能缩小同步范围

3.静态方法同步

  • 静态同步方法,实际锁的对象是这个类的对象(XXX.class)
  • 静态同步方法获取的是类对象的锁,所以一个线程获取后,其他线程只能等待获得锁后才能调用静态同步方法
  • 对于静态、非静态的同步方法,获取的是不同对象的锁,可以被不同的线程同时调用
  • 一个线程获得类的锁时,其他线程也不能调用该类的其他静态同步方法,会进入阻塞状态
  • 静态同步方法和synchronized(类名.class)实际的效果是一样的

4.线程同步的阻塞

如果线程试图进入同步方法,而其锁已经被占用,则线程在该对象上被阻塞。

 

5.线程死锁

多个线程等待对方锁的情况,称为死锁。

如线程T1拥有对象O1的锁,同时又需要对象O2的锁,但O2的锁现在是属于线程T2的,而T2又需要获取O1的锁,这样就造成两个线程处于阻塞状态,都在等待对方释放需要的对象锁。

分享到:
评论

相关推荐

    java多线程同步问题

    多线程注意:wait()方法的调用要有判定条件常用 while () obj.wait(timeout, nanos); ... // Perform action appropriate to condition } synchronized会影响共享数据,但对其他语句的执行不会有规律了!

    JAVA线程高级-线程按序交替执行

    然而,在某些场景下,我们可能需要控制线程的执行顺序,确保它们按照特定的顺序交替运行,这在并发编程中被称为线程同步或线程协调。Java提供了一些高级特性来实现这样的需求,比如`Thread`类、`synchronized`关键字...

    Java多线程-同步机制解决线程安全问题方式一:同步代码块

    这样,当一个线程正在执行同步代码时,其他试图访问相同资源的线程会被阻塞,直到持有锁的线程完成执行并释放锁。 二、同步锁原理 在Java中,每个对象都有一个内置的锁,也称为监视器锁或同步锁。当线程通过`...

    Java多线程编程总结

    Java线程:线程的同步与锁 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:线程的调度-优先级 Java线程:线程的调度-让步 Java线程:线程的调度-合并 Java线程:线程的调度-守护线程 Java线程:线程的...

    Java多线程-同步机制解决线程安全问题方式二:同步方法

    为了确保并发执行的线程能够正确地处理这些共享资源,Java提供了多种同步机制,其中之一就是同步方法。同步方法通过在方法前加上`synchronized`关键字来实现,确保同一时间只有一个线程可以执行该方法。 一、同步...

    Java多线程-线程的安全问题与线程的同步机制介绍

    常见的线程同步机制有:同步块(Synchronized Block)、同步方法(Synchronized Method)、锁(Lock)、Atomic 变量等。 四、线程安全问题解决方案 (1)方式一:实现Runnable接口 可以通过实现Runnable接口来...

    【IT十八掌徐培成】Java基础第08天-03.多线程-同步代码块-同步方法.zip

    本教程将深入讲解Java中的多线程以及同步控制机制,特别是同步代码块和同步方法。 首先,我们要理解什么是线程。线程是程序执行的最小单位,一个进程中可以有多个线程并发执行。在Java中,可以通过实现`Runnable`...

    动力节点_Java基础视频教程220_线程-线程同步-使用同步锁的卖票

    动力节点的Java课程适合绝对零基础的观看,教程中讲解了Java开发环境搭建、Java的基础语法、Java的面向对象。每一个知识点都讲解的非常细腻,由浅入深。适合非计算机专业,想转行做Java开发的朋友,或者想让Java基础...

    Java多线程-线程的同步与锁的问题

    Java多线程编程中,线程...总之,Java中的线程同步是通过锁机制实现的,目的是保护共享资源免受并发访问的影响,保证数据的一致性和正确性。开发者应该根据具体需求选择合适的同步策略,以提高程序的并发性能和稳定性。

    【IT十八掌徐培成】Java基础第08天-02.多线程-join-daemon-同步.zip

    Java还提供了`ReentrantLock`可重入锁,它具有更高的灵活性,可以实现更复杂的同步策略。`Semaphore`信号量控制对有限资源的访问,`CountDownLatch`计数器用于等待一组线程完成操作,`CyclicBarrier`循环栅栏允许一...

    Java线程-第三版(CHM电子版)

    7. **线程优先级与调度**:讨论Java线程的优先级模型,以及线程调度的策略和机制。 8. **守护线程与用户线程**:解释守护线程(Daemon Thread)的概念,以及它与用户线程的关系,如何创建和使用守护线程。 9. **...

    线程-线程池-锁-集合-Map-队列.docx

    Java线程有六种状态:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED。NEW表示线程刚创建还未启动,RUNNABLE表示线程在执行或等待CPU资源,BLOCKED表示线程被阻塞等待监视器锁,WAITING表示线程处于...

    Java多线程-避免同步机制带来的死锁问题及用Lock锁解决线程安全问题

    ### Java多线程-避免同步机制带来的死锁问题及用Lock锁解决线程安全问题 #### 死锁 ##### 1. 说明 在多线程编程中,死锁是一种常见的问题,指的是两个或多个线程在执行过程中,因为竞争资源而造成的一种相互等待...

    JAVA实现线程间同步与互斥生产者消费者问题

    在Java编程中,线程同步和互斥是多线程编程中的重要概念,它们用于解决多个线程同时访问共享资源时可能出现的问题。本项目通过一个生产者消费者问题的实例,展示了如何在Java中实现线程间的同步与互斥。 生产者消费...

    Java线程的同步与死锁

    #### 二、Java线程同步 ##### 2.1 同步的重要性 在多线程环境中,多个线程可能会同时访问共享资源,如果这些线程没有正确地进行同步,则可能会导致数据不一致或者程序行为异常。例如,考虑一个简单的银行账户余额...

    操作系统实验 多线程同步与互斥 java编写 有界面

    在“操作系统实验 多线程同步与互斥 java编写 有界面”的实验中,可能需要设计一个图形用户界面(GUI),通过按钮或事件触发线程的创建和同步操作,直观地展示线程间的交互和同步效果。例如,可以模拟银行账户转账,...

    java 线程同步 信号量控制同步

    Java 线程同步控制机制 线程同步是 Java 编程中的一种机制,用于控制多个线程之间的资源访问顺序,以避免线程之间的冲突和数据不一致。线程同步的目的就是避免线程“同步”执行,即让多个线程之间排队操作共享资源...

    JAVA 线程实现数据库的主从同步更新

    在Java编程环境中,...总之,使用Java线程实现数据库主从同步更新是一种常见且实用的技术手段,它涉及到多线程编程、数据库操作、事务管理等多个方面。理解和掌握这些知识点对于开发高可用性的分布式系统至关重要。

    Java多线程高并发篇(一)--重入锁

    在Java多线程高并发编程中,重入锁(ReentrantLock)是一个至关重要的概念,它提供了比Java内置锁(synchronized)更细粒度的控制,并且具有更高的可读性和可扩展性。本篇文章将深入探讨重入锁的相关知识点。 首先...

Global site tag (gtag.js) - Google Analytics