java多线程synchronized的使用及死锁的造成和解锁

1.synchronized在不同位置锁的内容
实际就是锁对象和锁类(不准确的说法)的区别。通常的用法都好理解,需要注意的是synchronized Method。如果方法是static的,那么很好理解,实际上也是锁了class;如果是普通方法则向当于对象锁synchronized(this)。但是由于锁的是对象本身(this),那么如果一个对象的多个方法都使用了synchronized,相互之前还是存在竞争关系的,所以容易造成死锁。
因此要谨慎使用方法级别的synchronized,除非方法之间是有明确的调用顺序,且不会有相互的嵌套调用以及其他的变量之间的竞争关系的。

2.简单的锁的形成方式
简单的来说锁的形成都是因为竞争关系,当有多个线程同时持有不同的锁有需要去持有对方的锁的时候就会发生死锁。或者一个线程持有锁的释放需要另外的线程的条件,而另外现成的条件达成需要获得前面的锁。

3.解锁的方法
每次尝试获取锁,如果获取不到,释放已有的锁。(实际使用中并不一定能简单的办到)

       try{
            if(getOneLock()){
                doSomething();
            }else{
               Log.e("Tag","cannot get lock!")
            }
        }finally {
            unlockAllPossessedLocks();
        }

4.CountDownLatch
CountDownLatch是一个同步工具类,可以实现有顺序的执行一定的任务,一定程度上也是一种同步的实现方式。其实是一种共享锁的实现。
使用场景:
1).实现最大的并行性。例如,我们想测试一个单例类。如果我们创建一个初始计数为1的CountDownLatch,并让所有线程都在这个锁上等待,那么我们可以很轻松地完成测试。我们只需调用 一次countDown()方法就可以让所有的等待线程同时恢复执行。
2).开始执行前等待n个线程完成各自的任务。
3).死锁的检查。一个非常方便的使用场景是,你可以使用n个线程访问共享资源,在每次测试阶段的线程数目是不同的,并尝试产生死锁。

参考博客:
http://www.jiacheo.org/blog/317
http://blog.chinaunix.net/uid-20665441-id-305490.html
http://blog.csdn.net/silk_bar/article/details/51051679
http://blog.csdn.net/dextrad_ihacker/article/details/53199220

猜你喜欢

转载自blog.csdn.net/u010748502/article/details/75331883