synchronized锁类和对象的区别,java同步锁synchronized原理

  synchronized锁类和对象的区别,java同步锁synchronized原理

  00-1010 1.对象级别2的同步锁。类级别3的同步锁。摘要

  Java synchronized关键字可以将代码块或方法标记为同步代码块。同步代码块是指一次只能由一个线程执行的代码,执行该代码的线程持有同步锁。同步关键字可以作用于

  当方法或代码块被声明为同步时,如果一个线程正在执行同步的方法或代码块,其他线程将被阻塞,直到持有同步锁的线程被释放。根据锁定的范围,它可以分为

  类级锁可以防止多个线程在运行时进入该类的所有实例化对象的同步代码块。对象级锁可以防止多个线程在运行时进入当前(或一个)实例化对象的同步代码块。

  00-1010对象级同步锁:当我们要在多线程环境中同步执行一个非静态方法或者非静态代码块时,在一个类的方法或者代码块中加入synchronized关键字,可以保证对象实例级数据的线程安全。(后面对比一下类级同步锁,后面理解这句话。)

  锁定对象级的代码如下,比如:锁定方法,锁定的对象是当前类的实例化对象。

  Public demo类{ public synchronized void demo method(){ } }比如锁定一个代码块,锁定的对象就是这个对象。

  Public demo类{ public void demo method(){ synchronized(this){//synchronize code blocks } }比如锁定一个代码块,锁定的对象是我们创建的任何对象。不要使用非fffinalalal成员变量作为同步锁对象,因为非final成员变量可以被重新分配,导致不同的线程使用不同的对象作为锁,无法达到同步锁的效果。

  class public demo class {//注意,这里的关键字final非常重要。参见private final object lock=new object()的描述;公共演示方法(){ synchronized(lock){//同步代码块}}}

  00-1010类级锁可以防止多个线程在运行时进入该类的所有实例化对象的“同步块”。也就是说,如果运行时有100个DemoClass实例,那么在任何一个实例中,一次只能有一个线程执行demoMethod(),其他所有实例的所有线程都被锁定。

  为了保证静态数据线的安全性,应该使用类级锁。我们知道static关键字将方法的数据与类的级别相关联,所以我们在静态方法上使用锁。

  静态方法锁定对该类的所有实例化对象都有效。

  公共类demo class {///静态方法锁定,并对该类的所有实例化对象生效。公共同步静态void演示方法(){}}获取。类,并在类级别锁定。

  public demo class { public void demo method(){//获取的引用。类class,类级锁,并对该类的所有实例化对象生效。同步(演示类。class){//同步代码块}}使用静态对象锁,类级锁。

  公共演示类{//静态对象,类级别,注意这里的关键字final很重要私有final静态对象lock=new object();public demo method(){//使用静态对象的锁,类级锁,对该类的所有实例化对象生效。synchronized (lock){//同步代码块}}

  00-1010 Java中的同步机制保证两个或多个线程不能同时执行需要相同同步锁的方法。“Synchronized”关键字只能用于方法和代码块。这些方法或代码块可以是静态的,也可以是非静态的。当线程进入同步的方法或代码块时,它获得一个锁,当它离开同步的方法或代码块时,它释放锁。如果线程执行过程中出现任何错误或异常,锁也会被释放。由 synchronized 关键字持有的锁本质上是可重入的,这意味着如果一个同步方法使用同一锁调用另一个同步方法,持有该锁的当前线程可以进入该方法,而无需再次获取该锁。如果同步块中使用的对象为空,Java synchronized将抛出NullPointerException。使用同步的同步方法会给应用程序带来性能损失。因此,只有在绝对必要时才尝试使用同步。另外,优先同步代码块,只同步代码的关键部分。静态和非静态同步方法可以同时或并发运行,因为它们使用不同的锁。根据Java语言规范,不能在构造函数中使用synchronized关键字。这是非法的,会导致编译错误。不要使用非fffinalalal成员变量作为同步锁对象,因为非final成员变量可以被重新分配,导致不同的线程使用不同的对象作为锁,无法达到同步锁的效果。不要使用字符串文字作为锁对象,例如:String a= 1因为它们可能在应用程序的其他地方被引用,并可能导致死锁。可以安全地使用用new关键字创建的字符串对象。这是Java对象级和类级同步锁的同步语法示例的细节。关于synchronized Java对象级和类级同步锁的更多信息,请关注其他热门的IT相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: