当前位置: 代码迷 >> J2SE >> 如何理解同步控制块synchronized
  详细解决方案

如何理解同步控制块synchronized

热度:71   发布时间:2016-04-23 19:53:25.0
怎么理解同步控制块synchronized

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

syncObject 与 花括号中代码 ,哪个是临界区,哪个是锁,锁的又是哪个,怎么理解他们两个
------解决思路----------------------
syncObject 是对象锁,大括号中的是你锁定的代码,就是要保证同一时刻只有一个线程可以执行大括号中的代码。
------解决思路----------------------
通常 syncObject 可以理解为:
Object  syncObject = new Object();
所以当某个线程执行到synchronized(syncObject) 时,代表获取了该对象的锁,那么其他线程再执行到这里时,就会等待。
------解决思路----------------------
临界区就是括号里所有的代码,其中必然有访问临界资源的,不然没必要同步
syncObject是对象锁,线程要进入临界区必须要持有这把锁,运行完了释放给其他线程
没有这把锁就只能等待
------解决思路----------------------
先抛开一些名词. 你就单纯的理解一下我说的这个例子.

syncObject 是一把钥匙, 并且是唯一的一把. 不管有多少个线程. 这个syncObject就只有一个, 先到先得.
这个类中, 有很多地方都有
syncronize(syncObject){
}
这样的代码块.  但是只要有一个线程先 运行到了 syncronize(syncObject) 这里, 表示先把钥匙拿走了, 就可以运行 {} 里面的东西, 其他线程就只能等 这个线程 把{} 里面的东西执行完了把syncObject交给下一个线程, 这样依次排队去执行 有syncronize(syncObject) 标记的{} 代码块.

所以正面回答你的问题就是
syncObject是锁, 锁的也是syncObject. 花括号里面的东西随时可以运行, 只不过N个线程同时运行的时候, 谁先获得syncObject, 谁就可以先运行{}里面的东西
syncroniz(syncObject){
}.本身就是为了在代码里面 对 相互会有冲突的代码块进行有序执行.  所以 syncObject可能会有多个. 代码块有冲突的, 用同一个syncObject.
不知道这样解释, 你是否懂.... 
  相关解决方案