怎么理解同步控制块synchronized

lingfeng892 2015-04-13 10:58:43

synchronized(syncObject) {
// This code can be accessed
// by only one task at a time
}

syncObject 与 花括号中代码 ,哪个是临界区,哪个是锁,锁的又是哪个,怎么理解他们两个
...全文
415 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
糖几颗的 2015-04-15
  • 打赏
  • 举报
回复
先抛开一些名词. 你就单纯的理解一下我说的这个例子. syncObject 是一把钥匙, 并且是唯一的一把. 不管有多少个线程. 这个syncObject就只有一个, 先到先得. 这个类中, 有很多地方都有 syncronize(syncObject){ } 这样的代码块. 但是只要有一个线程先 运行到了 syncronize(syncObject) 这里, 表示先把钥匙拿走了, 就可以运行 {} 里面的东西, 其他线程就只能等 这个线程 把{} 里面的东西执行完了把syncObject交给下一个线程, 这样依次排队去执行 有syncronize(syncObject) 标记的{} 代码块. 所以正面回答你的问题就是 syncObject是锁, 锁的也是syncObject. 花括号里面的东西随时可以运行, 只不过N个线程同时运行的时候, 谁先获得syncObject, 谁就可以先运行{}里面的东西 syncroniz(syncObject){ }.本身就是为了在代码里面 对 相互会有冲突的代码块进行有序执行. 所以 syncObject可能会有多个. 代码块有冲突的, 用同一个syncObject. 不知道这样解释, 你是否懂....
sww_1026 2015-04-15
  • 打赏
  • 举报
回复
只有在多线程同步访问syncObject对象才会上锁。。
lingfeng892 2015-04-15
  • 打赏
  • 举报
回复
引用 7 楼 luxiaoleics 的回复:
先抛开一些名词. 你就单纯的理解一下我说的这个例子. syncObject 是一把钥匙, 并且是唯一的一把. 不管有多少个线程. 这个syncObject就只有一个, 先到先得. 这个类中, 有很多地方都有 syncronize(syncObject){ } 这样的代码块. 但是只要有一个线程先 运行到了 syncronize(syncObject) 这里, 表示先把钥匙拿走了, 就可以运行 {} 里面的东西, 其他线程就只能等 这个线程 把{} 里面的东西执行完了把syncObject交给下一个线程, 这样依次排队去执行 有syncronize(syncObject) 标记的{} 代码块. 所以正面回答你的问题就是 syncObject是锁, 锁的也是syncObject. 花括号里面的东西随时可以运行, 只不过N个线程同时运行的时候, 谁先获得syncObject, 谁就可以先运行{}里面的东西 syncroniz(syncObject){ }.本身就是为了在代码里面 对 相互会有冲突的代码块进行有序执行. 所以 syncObject可能会有多个. 代码块有冲突的, 用同一个syncObject. 不知道这样解释, 你是否懂....
明白了,谢谢啊
飏飏一蝶 2015-04-14
  • 打赏
  • 举报
回复
临界区就是括号里所有的代码,其中必然有访问临界资源的,不然没必要同步 syncObject是对象锁,线程要进入临界区必须要持有这把锁,运行完了释放给其他线程 没有这把锁就只能等待
lingfeng892 2015-04-14
  • 打赏
  • 举报
回复
引用 1 楼 tianyahaijiaozhao 的回复:
syncObject 是对象锁,大括号中的是你锁定的代码,就是要保证同一时刻只有一个线程可以执行大括号中的代码。
临界区在哪? syncObject 的作用是什么?
sg19911227 2015-04-14
  • 打赏
  • 举报
回复
2楼正解!!!!!!!
普凡 2015-04-14
  • 打赏
  • 举报
回复
通常 syncObject 可以理解为: Object syncObject = new Object(); 所以当某个线程执行到synchronized(syncObject) 时,代表获取了该对象的锁,那么其他线程再执行到这里时,就会等待。
tianyahaijiaozhao 2015-04-14
  • 打赏
  • 举报
回复
syncObject 是对象锁,大括号中的是你锁定的代码,就是要保证同一时刻只有一个线程可以执行大括号中的代码。

62,635

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧