synchronize lock区别,synchronized 和lock

  synchronize lock区别,synchronized 和lock

  如何解决写爬虫IP受阻的问题?立即使用。

  在分布式开发中,锁是线程控制的一种重要方式。Java还提供了两种锁定机制,synchronized和lock。

  0、synchronized实现原理

  Java中的每个对象都可以用作锁,这是同步的基础:

  常见的同步方法,锁是当前实例对象。

  静态同步方法,锁是当前类的类对象

  同步方法块,锁是括号里的对象。

  当一个线程访问一个同步代码块时,它首先需要获得锁,当它退出或抛出异常时,它必须释放锁。那么它是如何实现这个机制的呢?让我们先看一个简单的代码:

  包cn . alibab . javap;公共类同步测试{

  公共同步void test1(){

  } public void test 2(){ synchronized(this){

  }

  }

  }使用javap工具(javap是java编译类文件的解析器)查看生成的类文件信息,分析Synchronized的实现。

  从上面可以看出,同步代码块是使用monitorenter和monitorexit指令实现的,同步方法(这里看不到,取决于JVM的底层实现)取决于方法修饰符上的ACC_SYNCHRONIZED实现。

  同步代码块:monitor enter指令插入到编译后同步代码块的起始位置,monitorexit指令插入到同步代码块的结束位置。JVM需要确保每个monitorenter都有一个与之对应的monitorexit。任何对象都有一个与之关联的监视器,当监视器被按住时,它将被锁定。线程执行monitorenter指令时,会试图获取对象对应的监视器所有权,即试图获取对象的锁;[摘自并发编程的艺术]

  同步方法:同步的方法将被翻译成普通的方法调用和返回指令,如invokevirtual和areturn指令。在VM字节码级别没有特殊的指令来实现同步修改的方法。而是在类文件的方法表中将方法的access_flags字段中的synchronized标志位置设置为1,表示该方法为同步方法,并使用调用该方法的对象或该方法所属的类将Klass表示为JVM中的锁对象。(来自:http://www.cnblogs.com/javaminer/p/3889023.html)

  synchronized和lock的区别

  区别如下:

  来源:

  Lock是接口,synchronized是java的关键词。synchronized是内置的语言实现;

  异常解锁:

  Synchronized会在异常发生时自动释放被占用的锁,所以不会出现死锁;当锁异常时,被占用的锁不会被主动释放,必须手动释放锁,这可能会导致死锁。(所以最好用try catch包装同步代码块,最后在里面写unlock,避免死锁。)

  响应是否中断?

  在等待锁的时候,中断可以用来中断等待,而synchronized只能等待锁的释放,而不能响应中断;

  你知道怎么开锁吗?

  Lock可以通过trylock知道是否获取锁,synchronized不能;

  锁可以提高多线程的读取效率。(读写锁可用于区分读写)

  在性能方面,如果资源竞争不激烈,两者的性能差不多,而当资源竞争激烈时(即大量线程同时竞争),Lock的性能远远优于synchronized。所以具体使用要根据适当的情况来选择。

  Synchronized使用对象本身的wait、notify和notifyAll调度机制,而Lock可以使用Condition在线程之间进行调度。

  //Condition定义了两种等待/通知方法。

  lock lock=new reentrant lock();

  condition condition=lock . new condition();condition . await();condition . signal();

  condition . signal all();1、synchronized和lock的用法区别

  Synchronized:将该控件添加到需要同步的对象中。Synchronized可以添加到方法或特定的代码块中。需要锁定的对象用括号表示。

  锁:通常,ReentrantLock类被用作锁。需要通过显示锁定()和解锁()来指示锁定和解锁点。因此,unlock()通常写在finally块中,以防止死锁。

  2、synchronized和lock性能区别

  Synchronized由JVM管理执行,

  而lock就是java写的控制锁的代码。

  在Java1.5中,同步效率很低。因为这是一个重量级的操作,所以需要调用操作接口,这就有可能锁定比锁定以外的操作消耗更多的系统时间。与Java提供的锁对象相比,性能更高。

  但是有了Java1.6,事情就变了。Synchronize语义清晰,可以通过多种方式进行优化,比如自适应旋转、锁消除、锁粗化、轻量级锁、偏置锁等等。Java1.6上synchronize的性能并不比Lock差。官方也表示,也更支持synchronize,未来版本还有优化的空间。

  两种机制的具体区别:synchronized原始采用的是CPU悲观锁机制,即线程获得的是独占锁。独占锁是指其他线程只能依靠阻塞来等待线程释放锁。但是,当CPU转换线程被阻塞时,会引起线程上下文切换。当有多个线程争夺锁时,会造成CPU频繁的上下文切换,导致效率低下。

  而Lock用的是乐观锁方式。所谓乐观锁就是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。乐观锁实现的机制就是CAS操作(比较和交换).我们可以进一步研究ReentrantLock的源代码,我们会发现获取锁的一个比较重要的方法是compareAndSetState。其实这是调用CPU提供的特殊指令。

  现代CPU提供了可以自动更新共享数据和检测其他线程干扰的指令,compareAndSet()用这些代替了锁定。这种算法叫做非阻塞算法,意思是一个线程的失败或挂起不应该影响到其他线程的失败或挂起。

  3、synchronized和lock用途区别

  一般来说synchronized原语和ReentrantLock没有区别,但是在非常复杂的同步应用中,请考虑使用ReentrantLock,尤其是在遇到以下两个需求时。

  1.线程在等待锁的控制权时需要被中断。

  2.ReentrantLock中的一些wait-notify和Condition应用需要分开处理,可以控制notify的哪个线程。

  3.有了公平锁功能,每个进来的线程都会排队等待。

  下面是详细的解释.

  先说第一种情况。ReentrantLock有两种锁机制,忽略中断锁和响应中断锁,给我们带来了很大的灵活性。比如两个线程A和B争夺锁,线程A得到锁,线程B等待,但是线程A此时真的有太多事情要处理,就是一去不返,线程B可能不耐烦了,想自己中断,停止等待这个锁,转而去处理其他的事情。此时ReentrantLock就提供了2种机制:可中断/可不中断

  首先,线程B中断自己(或者其他线程中断它),但是ReentrantLock没有响应,让线程B一直等待。不管你怎么打断,我都充耳不闻(像同步原始人);

  第二,线程B自己中断(或者另一个线程中断),ReentrantLock处理这个中断,不等待锁到达就完全放弃。

  有关编程的更多信息,请访问:编程视频!这就是同步和锁定的区别?更多详情请关注我们的其他相关文章!

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

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