一:研究方向:synchronize lock 同步方法,同步代码块, lock与unlock的使用, lock 与synchronize 的比较
①:synchronize使用同步与不同步的区别:
未使用synchronize public class Threadtongbu implements Runnable{ public static int sum=10; @Override public void run() { sum--; System.out.println(Thread.currentThread().getName()+"取走了1个"); System.out.println("还剩下:"+sum); } public static void main(String[] args) { Threadtongbu threadtongbu=new Threadtongbu(); Thread n1=new Thread(threadtongbu); Thread n2=new Thread(threadtongbu); n1.start(); n2.start(); } }
Thread-0取走了1个 Thread-1取走了1个 还剩下:8 还剩下:8
|
使用synchronize
public class Threadtongbu implements Runnable{ public static int sum=10; @Override public synchronized void run() { sum--; System.out.println(Thread.currentThread().getName()+"取走了1个"); System.out.println("还剩下:"+sum); } public static void main(String[] args) { Threadtongbu threadtongbu=new Threadtongbu(); Thread n1=new Thread(threadtongbu); Thread n2=new Thread(threadtongbu); n1.start(); n2.start(); } }
Thread-0取走了1个 还剩下:9 Thread-1取走了1个 还剩下:8
|
线程安全问题:
同步方法的使用
1.同步方法的锁(同步监视器)是谁?
锁是this,意味着只要有一个方法被锁住,所有的同步方法都被锁着了
2.给run方法加synchronized好不好?
不好,因为变成了单线程,可以将需要同步的代码提取出来为一个方法,将该方法设置为同步方法即可
3.优先推荐使用同步代码块,再考虑使用同步方法
②:Lock锁的使用
public class Threadtongbu implements Runnable{ public static int sum=10; Lock lock=new ReentrantLock(); @Override public void run() { extie(); } public void extie() { lock.lock(); sum--; System.out.println(Thread.currentThread().getName() + "取走了1个"); System.out.println("还剩下:" + sum); lock.unlock(); } public static void main(String[] args) { Threadtongbu threadtongbu=new Threadtongbu(); Thread n1=new Thread(threadtongbu); Thread n2=new Thread(threadtongbu); n1.start(); n2.start(); } }
|
Lock锁的使用:
1.jdk 1.5后才能使用
2.显示锁,所有的操作都需要程序自己写代码(准备锁,自己上锁,自己开锁)
3.Lock是jdk 1.5 中提供的一个接口,常用实现类: ReentrantLock
4.Lock与synchronized的比较
Lock锁
jdk 1.5 后新增的功能,与采用synchronized 相比,lock可提供多种锁方案,更灵活 java.util.concurrent.lock中的Lock 框 架是锁定的一个抽象,它允许把锁定的实现作为Java类,而不是作为语言的特性来实现。
这就为Lock的多种实现留下了空间,各种实现可能有不同的调度算法,性能特性或者锁定语义。
ReentrantLock类实现Lock,它拥有与synchronized相同的并发性和内存语义,但是添加了类似的锁投票,定时锁等候和
可中断锁等锁的一些特性,此外,它还提供了在激烈征用更加的性能
注意:如果同步代码有异常,要将unlock() 写入finally语句块
Lock与synchronized的区别
①:Lock是显示锁,手动开启与关闭, synchronized是隐私锁
②:Lock只是代码块,synchronized有代码块与方法锁
③: 使用Lock锁,Jvm将花费较少的时间来调度线程,性能更好,并且具有更好的扩展性,提供更多的子类
5.使用优先
lock ----同步代码块(已进入方法体,分配了相应资源)-----同步方法(在方法体之外)