黑马程序员技术交流社区

标题: 同步中的一个小问题, [打印本页]

作者: 凉仁日记    时间: 2015-5-26 16:26
标题: 同步中的一个小问题,
同步代码块和同步方法有什么区别,我只记得他们都使用this,其他的想不起来,希望大神指教
作者: pvbj0314    时间: 2015-5-26 20:37
本帖最后由 pvbj0314 于 2015-5-26 20:40 编辑

同步方法是在方法声明中加入关键字synchronized。
  1. public class SynchronizedCounter {
  2.     private int c = 0;
  3.     public synchronized void increment() {
  4.         c++;
  5.    }
  6.    public synchronized void decrement() {
  7.         c--;
  8.    }
  9.    public synchronized int value() {
  10.       return c;
  11.    }
  12. }
复制代码
如果count是SynchronizedCounter的实例,使这些方法同步有两个效果:
[size=18.3333320617676px]• 首先,对同一对象来说,两个同步方法调用不存在重叠。当一个线程执行一个对象的同步方法时,所有其它线程对同一对象的同步方法调用都被阻塞,直到第一个线程对那个对象的操作执行完。
[size=18.3333320617676px]• 第二,当一个同步方法退出时,对象状态的改变可以被所有线程看到。
[size=18.3333320617676px]同步方法使用的是this作为锁的对象。
注意构造函数不能被同步——在构造函数声明中使用synchronized关键字是一个句法错误。
[size=18.3333320617676px]

同步表达式
同步代码块是另一种创建同步代码的方式。与同步方法不同,同步表达式必须定义提供同步锁的对象:[size=18.3333320617676px]
  1. public void addName(String name) {
  2.     synchronized(this) {
  3.         lastName = name;
  4.         nameCount++;
  5.     }
  6.     nameList.add(name);
  7. }
复制代码


这个例子中,addName方法需要同步lastName和nameCount的改变,也需要避免其它对象的方法的同步调用。没有同步表达式,这只有一个独立的不同步的方法,唯一的目的是调用nameList.add。

[size=18.3333320617676px]






作者: 城北一直晴。    时间: 2015-5-26 20:49
楼上讲的很赞
作者: 凉仁日记    时间: 2015-5-26 21:17
pvbj0314 发表于 2015-5-26 20:37
同步方法是在方法声明中加入关键字synchronized。如果count是SynchronizedCounter的实例,使这些方法同步有 ...

谢谢详细的讲解
作者: 途中ms前进    时间: 2015-5-28 11:09
过来看看学习下
作者: 进击的蜗牛    时间: 2015-5-28 11:17
学习学习
作者: 我是小水水    时间: 2015-5-28 11:37
同步代码块使用的锁可以是任意对象。
同步函数使用的锁是this,静态同步函数的锁是该类的字节码文件对象。
在一个类中只有一个同步,可以使用同步函数。如果有多同步,必须使用同步代码块,来确定不同的锁。所以同步代码块相对灵活一些。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2