同步的原理:其实就是将需要同步的代码进行封装,并在该代码上加了一个锁。
同步的好处:解决了多线程的安全问题。
同步的弊端:会降低性能。
同步的前提:必须要保证在同步中有多个线程。因为同步中只有一个线程该同步是没有意义的。
必须要保证多个线程在同步中使用的是同一个锁。
必须保证多个线程使用的锁是同一个,这时才成为多个线程被同步了。
同步有两种表现形式:一种就是同步代码块。同步代码块中的锁可以是任意的对象,用Object obj = new Object();可以作为同步代码块中的锁。
synchronized(对象) //对象可以使任意的对象。 { 需要被同步的语句。 }
另一种就是同步函数。就是在函数中加入同步代码块的关键字synchronized,这样就能使该函数变为同步函数。 函数肯定被对象调用,代表调用函数对象的引用就是this。也就是说同步函数使用的锁是this。
同步函数和同步代码块有什么区别呢? 1、同步函数比同步代码块写法简单。 2、同步函数使用的锁是this。同步代码块使用的锁是任意指定的对象。 建议开发时,使用同步代码块,尤其是需要不同锁时。
以上是JDK1.5之前使用同步代码块和同步函数来解决多线程中的安全性问题。
但在JDK1.5中,JDK出现了新的借口和类那就是Lock和Condition。
Lock:比同步函数和同步代码块要好。
分析发现:同步函数还是同步代码块所做的都是隐式的锁操作。
同步函数或者同步代码块使用的锁和监视器是同一个。
Lock借口:是将锁进行单独对象的封装。而且提供了对锁对象很多功能 比如:lock()获取锁,unlock()释放锁。Lock对锁的操作都是显示的。
所以它的出现要比同步函数或者同步代码块明确的多,更符合面向对象的思想。
简单一句话:Lock借口的出现替代了同步(函数和代码块)。 原来在同步中,锁和监视器是同一个对象(在同步里)。 现在,升级后,锁是一个单独的对象。而且将监视器的方法也单独封装到了一个对象中, 这个对象就是升级后的Condition。 升级后,都进行了单独的封装,锁被封装成了Lock对象,监视器方法被封装到了 Condition对象(监视器)中。 说白了:Lock替代了同步,Condition代替了Objcet中的监视器方法。 Condition中提供了监视器的方法:await().singal().signalAl(); 如何让锁和监视器产生联系呢? 直接通过Lock接口中newCondition()方法就可以获取到绑定到该Lock对象上的监视 器对象Condition
以上是我在学习过程中总结的笔记,希望多楼主有用!{:soso__8961432591078930798_3:} |