我添加了另一个答案,因为我还没有添加评论给其他人的帖子。

>事实上,同步是用于代码,而不是对象或数据。在同步块中用作参数的对象引用表示锁定。

所以如果你有如下代码:

class Player {

// Same instance shared for all players... Don't show how we get it now.

// Use one dimensional board to simplify, doesn't matter here.

private List[] fields = Board.getBoard();

// Current position

private int x;

public synchronized int getX() {

return x;

}

public void setX(int x) {

synchronized(this) { // Same as synchronized method

fields[x].remove(this);

this.x = x;

field[y].add(this);

}

}

}

然后尽管在同步块上存在,但对字段的访问不受保护,因为锁不一样(它在不同的实例上)。因此,您的主板的播放器列表可能会变得不一致,并导致运行时异常。

相反,如果你写下面的代码,它将工作,因为我们只有一个共享锁为所有玩家:

class Player {

// Same instance shared for all players... Don't show how we get it now.

// Use one dimensional board to simplify, doesn't matter here.

private List[] fields;

// Current position

private int x;

private static Object sharedLock = new Object(); // Any object's instance can be used as a lock.

public int getX() {

synchronized(sharedLock) {

return x;

}

}

public void setX(int x) {

synchronized(sharedLock) {

// Because of using a single shared lock,

// several players can't access fields at the same time

// and so can't create inconsistencies on fields.

fields[x].remove(this);

this.x = x;

field[y].add(this);

}

}

}

=>确保只使用一个锁来访问所有玩家,否则您的棋盘状态将不一致。

java 同步块的锁是什么,java – 同步块 – 锁定多个对象相关推荐

  1. java runnable线程锁_多线程 java 同步 、锁 、 synchronized 、 Thread 、 Runnable

    线程 1 线程概述 1.1 什么是线程 v  线程是程序执行的一条路径, 一个进程中可以包含多条线程 v  一个应用程序可以理解成就是一个进程 v  多线程并发执行可以提高程序的效率, 可以同时完成多 ...

  2. java同步锁实例_Java lock同步锁使用实例解析

    这篇文章主要介绍了Java lock同步锁使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1)Lock是一个接口,而synchroniz ...

  3. java同步锁售票_线程同步锁之火车站售票案例

    前言: 谈到多线程,就不得不说线程同步,那么什么是线程同步? 线程同步 即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作 ...

  4. java 同步解决不安全类_「JAVA」Java 线程不安全分析,同步锁和Lock机制,哪个解决方案更好...

    线程不安全 线程不安全的问题分析:在小朋友抢气球的案例中模拟网络延迟来将问题暴露出来:示例代码如下: public class ImplementsDemo { public static void ...

  5. Java多线程之线程同步机制(锁,线程池等等)

    Java多线程之线程同步机制 一.概念 1.并发 2.起因 3.缺点 二.三大不安全案例 1.样例一(模拟买票场景) 2.样例二(模拟取钱场景) 3.样例三(模拟集合) 三.同步方法及同步块 1.同步 ...

  6. 使用线程锁(lock)实现线程同步_一文搞懂Java多线程使用方式、实现原理以及常见面试题...

    本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下 ...

  7. java多线程学习二、安全与不安全示例:12306买票和银行取钱、java内存模型、内存可见性、线程同步块和方法

    文章目录 前言 1. 什么是块,分为几种 2. 静态块与构造块的区别 一. 举例说明:并发情况下,线程不安全 1. 示例1:unsafe12306取票 2. 示例2:unsafe银行取钱 二.线程不安 ...

  8. Java:多线程(同步死锁、锁原子变量、线程通信、线程池)

    5,同步和死锁 5.1,线程同步 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象: 修饰一个方法,被修饰的方法称为同步方法,其作用 ...

  9. java同步锁如何使用_java 同步锁(synchronized)的正确使用姿势

    关于线程安全,线程锁我们经常会用到,但你的使用姿势正确不,反正我用错了好长一段时间而不自知.所以有了这篇博客总结下线程锁的正确打开姿势 废话不说看例子 一,对整个方法进行加锁 1,对整个方法进行加锁, ...

最新文章

  1. 广东汕尾2021年高考成绩查询,广东汕尾2021年高考英语听说考试成绩查询入口
  2. 1005 矩阵快速幂
  3. Safari tabindex 不工作的问题 (误
  4. 批处理解决局域网共享打印机问题
  5. linux系统下PHP无法调用oracle数据库的解决方法
  6. python可以怎么玩_这波太炸了!Python脚本可视化居然可以这么玩!
  7. 浅说position定位及z-index使用
  8. erase() 返回的是删除此元素之后的下一个元素的迭代器 .xml
  9. java连接redis不稳定_java相关:jedispool连redis高并发卡死的问题
  10. [Flink]Flink DataStream window join 和interval join
  11. 经典排序算法(十八)--Proxmap Sort
  12. hadoop2.2完全分布式最新高可靠安装文档
  13. c++ const 修饰变量位置含义
  14. CoinCola研究院 | 从技术的角度解读BCH分叉升级
  15. FTP服务器的搭建,可两个电脑通过局域网进行传输
  16. RK3399 上电待机,按power按键开机
  17. 异度之刃2 任务打杂店的帮手去哪获取纯洁石
  18. c语言编程小球运行结果是,如何用C语言编程一个滚动的小球 最好是五彩的 滚动的...
  19. 山东航天九通车联网:大数据技术引领为智慧物流赋能
  20. 一款网易云音乐歌词制作软件

热门文章

  1. 使用springboot集成jseesite
  2. 三星为什么要卖芯片?手机干不过华为小米,半导体好挣钱!
  3. Alictf 2015决赛题目设计和解题思路
  4. 2月份Web服务器份额:排名不变 仅Microsoft份额上扬
  5. redis简单学习3-redis常用命令总结
  6. Java开发环境搭建详解
  7. SAP 免费赠与客户货物的销项税处理
  8. 求一个张量的梯度_张量流中离散策略梯度的最小工作示例2 0
  9. spring—配置数据源
  10. leetcode1487. 保证文件名唯一