多线程(14)线程同步2

一:研究方向: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  ----同步代码块(已进入方法体,分配了相应资源)-----同步方法(在方法体之外)

 

posted @ 2022-03-13 10:46  iLisa  阅读(37)  评论(0编辑  收藏  举报