A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 凉仁日记 中级黑马   /  2015-5-26 16:26  /  541 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

同步代码块和同步方法有什么区别,我只记得他们都使用this,其他的想不起来,希望大神指教

6 个回复

倒序浏览
本帖最后由 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]





评分

参与人数 1技术分 +1 收起 理由
lwj123 + 1

查看全部评分

回复 使用道具 举报 1 0
楼上讲的很赞
回复 使用道具 举报
pvbj0314 发表于 2015-5-26 20:37
同步方法是在方法声明中加入关键字synchronized。如果count是SynchronizedCounter的实例,使这些方法同步有 ...

谢谢详细的讲解
回复 使用道具 举报
过来看看学习下
回复 使用道具 举报
学习学习
回复 使用道具 举报
同步代码块使用的锁可以是任意对象。
同步函数使用的锁是this,静态同步函数的锁是该类的字节码文件对象。
在一个类中只有一个同步,可以使用同步函数。如果有多同步,必须使用同步代码块,来确定不同的锁。所以同步代码块相对灵活一些。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马