A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

© 谭荣强 高级黑马   /  2014-4-16 14:27  /  1001 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一个代码块,相当于一个厕所,下面这是几个厕所。
        if(flag){                         
                        synchronized (a) {
                        System.out.println("if ..a");
                        synchronized (b) {
                                System.out.println("if..b");                         
                        }
                        }
                }               
                else{                         
                synchronized (b) {
                System.out.println("else..c");
                synchronized (a) {
                        System.out.println("else..d");
                        }
                        }
                }

1 个回复

倒序浏览
是两个锁,a锁和b锁

多线程的运行容易出现问题

问题的原因:
        当多条语句在操作同一个线程共享数据时,一个线程对多条语句只执行了一部分,还没有执行完
        另一个线程参与进来执行,导致共享数据的错误

解决办法:
        对多条操作共享数据的语句,只能让一个线程都执行完;在执行的过程中,其他线程不可以参与执行

java对于多线程的安全问题提供了专业的解决方式
就是同步代码块

synchronized(对象)
{
        需要被同步的代码;
}

同步的前提:
1,必须有两个或两个以上的线程
2,必须是多个线程使用同一个锁

必须保证同步中只能有一个线程运行

好处:解决多线程的安全问题
弊端:多个线程都需要判断锁,较为消耗资源

在同步中嵌套同步,会出现死锁,如:
  1. class Test implements Runnable{
  2.         private boolean flag;
  3.         Test(boolean flag){
  4.                 this.flag = flag;
  5.         }
  6.         public void run(){
  7.                 if(flag){
  8.                         synchronized(MyLock.locka){
  9.                                 System.out.println("if locka");
  10.                                 synchronized(MyLock.lockb){
  11.                                         System.out.println("if lockb");
  12.                                 }
  13.                         }
  14.                 }
  15.                 else{
  16.                         synchronized(MyLock.lockb){
  17.                                 System.out.println("else lockb");
  18.                                 synchronized(MyLock.locka){
  19.                                         System.out.println("else locka");
  20.                                 }
  21.                         }
  22.                 }
  23.         }
  24. }

  25. MyLock{
  26.         static Object locka = new Object();
  27.         static Object lockb = new Object();
  28. }

  29. class LoackTest{
  30.         public static void main(String[] args){
  31.                 Thread t1 = new Thread(new Test());
  32.                 Thread t2 = new Thread(new Test());
  33.         }
  34. }
复制代码

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马