设为首页 加入收藏

TOP

Java多线程编程实例—锁优化(二)
2018-02-13 12:56:54 】 浏览:407
Tags:Java 线程 编程 实例 优化
public void method1() {
        A a = new A();
        synchronized (a) { //直接进行加锁
      a.method1();


        }
    }
}


这种使用方式下,对象a的对象锁被外部所持有,让这把锁在外部多个地方被使用是比较危险的,对代码的逻辑流程阅读也造成困扰。一种更好的方式是在类的内部自己管理锁,外部需要同步方案时,也是通过接口方式来提供同步操作:


class A {
    private Object lock = new Object();
    public void method1() {
        synchronized (lock){
           
        }
    }
}


class B {
    public void method1() {
        A a = new A();
        a.method1();
    }
}


五、进行适当的锁分解


考虑下面这段程序:


public class GameServer {
  public Map<String, List<Player>> tables = new HashMap<String, List<Player>>();


  public void join(Player player, Table table) {
    if (player.getAccountBalance() > table.getLimit()) {
      synchronized (tables) {
        List<Player> tablePlayers = tables.get(table.getId());
        if (tablePlayers.size() < 9) {
          tablePlayers.add(player);
        }
      }
    }
  }
  public void leave(Player player, Table table) {/*省略*/}
  public void createTable() {/*省略*/}
  public void destroyTable(Table table) {/*省略*/}
}


在这个例子中,join方法只使用一个同步锁,来获取tables中的List<Player>对象,然后判断玩家数量是不是小于9,如果是,就调增加一个玩家。当有成千上万个List<Player>存在tables中时,对tables锁的竞争将非常激烈。在这里,我们可以考虑进行锁的分解:快速取出数据之后,对List<Player>对象进行加锁,让其他线程可快速竞争获得tables对象锁:


public class GameServer {
  public Map<String, List<Player>> tables = new HashMap<String, List<Player>>();


  public void join(Player player, Table table) {
    if (player.getAccountBalance() > table.getLimit()) {
      List<Player> tablePlayers = null;
      synchronized (tables) {
          tablePlayers = tables.get(table.getId());
      }
     
      synchronized (tablePlayers) {
        if (tablePlayers.size() < 9) {
          tablePlayers.add(player);
        }
      }
    }
  }


 public void leave(Player player, Table table) {/*省略*/}
 public void createTable() {/*省略*/}
 public void destroyTable(Table table) {/*省略*/}
}


首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇GDB 简易入门教程 下一篇Java锁机制 synchronized 详解

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目