黑马程序员技术交流社区

标题: 请教:为什么同步代码块不能定义到成员位置? [打印本页]

作者: HM朱蛟    时间: 2013-3-21 01:36
标题: 请教:为什么同步代码块不能定义到成员位置?
本帖最后由 HM朱蛟 于 2013-3-21 22:35 编辑

错误CODE
  1. class Bank
  2. {
  3.         private int m ;//共享数据
  4.         
  5.         Object obj = new Object();//共享数据
  6.              synchronized(obj)
  7. {
  8.      void add(int n)//被多线程所执行
  9.                {
  10.           m +=n;
  11.                     try {Thread.sleep(10);} catch (Exception e) {}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               
  12.                           System.out.println("Money="+m);                              
  13.                 }
  14.      }
  15. }

  16. class cus implements Runnable//消费者
  17. {
  18.                 private Bank b = new Bank();//共享数据
  19.                 public void run()  //被多线程所执行
  20.                 {
  21.                         for(int i=0;i<3;i++)
  22.                             b.add(100);
  23.                 }
  24. }

  25. class Run
  26. {
  27.         public static void main(String[] args)
  28.         {
  29.                 cus c = new cus(); //Runnable子类,用于传参。可以
  30.                
  31.                 Thread t1 = new Thread(c);
  32.                 Thread t2 = new Thread(c);
  33.                 t1.start();
  34.                 t2.start();
  35.         }
  36. }
复制代码
报错信息:
fx.java:29: 非法的类型开始
                 synchronized(obj){
                             ^
fx.java:29: 需要 ';'
                 synchronized(obj){
                              ^
fx.java:29: 非法的类型开始
                 synchronized(obj){
                                 ^
fx.java:29: 需要 <标识符>
                 synchronized(obj){
                                  ^
fx.java:29: 需要 ';'
                 synchronized(obj){
                                   ^
fx.java:30: 方法声明无效;需要返回类型
  void add(int n)//被多线程所执行
       ^
fx.java:44: 需要为 class、interface 或 enum
}
^
7 错误


小弟知道吧同步代码块放进去一层可以通过编译,但是小弟想知道为什么这样编译通不过。谢谢了
另外希望大侠们分享下关于同步代码块封装代码范围的一些心得,我还只停留在初始阶段,一般遇见问题我的思路是:
1:找出所有的多线程执行代码
2:找出可能出执行顺序混乱的地方,一般是多条语句的聚集点。
3:最后用synchronized封装出问题的区域

关键就是第三步,对于这个问题区域的范围小弟拿捏不好
作者: 李尧    时间: 2013-3-21 01:52
楼主碉堡...
作者: 李尧    时间: 2013-3-21 03:23
卤煮你坑我..你的帖子一个小时前不是这样的.......
好吧,我还是要说下我的个人看法:
void add(int n)是你在Class bank 这个类里面定义的一个方法,或者说成员?.
我的看法是这样的,代码块本身也许可以看做一个方法,你可以在一个方法内部去调用其他方法,但是你不能在一个方法内部去定义一个方法吧..那不是感觉怪怪的...
或者,你定义了一个类,类中定义了一个成员,然后你把这个成员给扔到同步块里去了..感觉还是怪怪....
我测试了一下,好像只有构造块和静态代码块可以直接写在成员位置上...哪怕你同步块里面什么也不写,还是报错...
语无伦次了..坐等高人来解答...

作者: HM朱蛟    时间: 2013-3-21 03:28
李尧 发表于 2013-3-21 03:23
卤煮你坑我..你的帖子一个小时前不是这样的.......
好吧,我还是要说下我的个人看法:
void add(int n)是你在 ...

不好意思 最开始哪个问题我疑问出来 突然就知道答案所以就编辑掉了

感谢这么晚还在回复我的帖子   
作者: HM朱蛟    时间: 2013-3-21 03:31
李尧 发表于 2013-3-21 03:23
卤煮你坑我..你的帖子一个小时前不是这样的.......
好吧,我还是要说下我的个人看法:
void add(int n)是你在 ...

确实是  貌似吧同步代码块定义到成员位置就不能通过编译  
作者: 谢洋    时间: 2013-3-21 10:32
构造代码块一旦对象初始化完成,你还能调用吗?
作者: HM朱蛟    时间: 2013-3-21 19:47
谢洋 发表于 2013-3-21 10:32
构造代码块一旦对象初始化完成,你还能调用吗?

不能啊   请问这两者有什么联系吗?
作者: 谢洋    时间: 2013-3-21 20:00
HM朱蛟 发表于 2013-3-21 19:47
不能啊   请问这两者有什么联系吗?

既然没法再被调用,加同步会什么意义?
作者: HM朱蛟    时间: 2013-3-21 20:14
谢洋 发表于 2013-3-21 20:00
既然没法再被调用,加同步会什么意义?

请问我这样理解不知道对不对
    同步代码块 放在成员位置  可以看做是一个构造代码快被同步修饰 因为构造代码块也是定义在成员位置  

若放在方法内  可以看做是一个一个局部代码块被同步修饰
作者: 谢洋    时间: 2013-3-21 21:44
HM朱蛟 发表于 2013-3-21 20:14
请问我这样理解不知道对不对
    同步代码块 放在成员位置  可以看做是一个构造代码快被同步修饰 因为构 ...

大概也是这样子
作者: HM朱蛟    时间: 2013-3-21 22:34
谢洋 发表于 2013-3-21 21:44
大概也是这样子

谢谢  虽然没有怎么理解  但是大致知道  “这是一件没有意义的事”  更深入的理解 只能今后慢慢再去感受了 谢谢




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