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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 余志强 黑马帝   /  2011-10-15 15:23  /  2444 人查看  /  9 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 余志强 于 2011-10-15 15:25 编辑

    内部类   class Outputer {
                String s = "";
                public void output(String str) {
                        synchronized (s) {
                                for (int i = 0; i < str.length(); i++) {
                                        System.out.print(str.toCharArray());
                                }
                                System.out.println();
                        }
                }
                public synchronized void output2(String str) {
                        for (int i = 0; i < str.length(); i++) {
                                System.out.print(str.toCharArray());
                        }
                        System.out.println();
                }
        }

新建两个线程:

        public void init() {
                 final Outputer out = new Outputer();
                // 创建两个线程
                new Thread(new Runnable() {
                        public void run() {
                                while (true) {
                                        try {
                                                Thread.sleep(10);
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                        out.output("zhangxiaoxiang");
                                }
                        }
                }).start();
                new Thread(new Runnable() {
                        public void run() {
                                while (true) {
                                        try {
                                                Thread.sleep(10);
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                        out.output2("lihuoming");
                                }
                        }

                }).start();
        }


主方法:
        public static void main(String[] args) {
                new TraditionalThreadSynchronizd().init();
        }
在同步代码块中使用String对象最为同步监视器,在同步方法中使用this作为监视器,那么为什么输出却不同步呢?
我是这样想的,当一个线程执行同步代码块,另一个线程也来执行该同步代码块,因为同步监视器s,是一样的,那么后来的线程只有等待,同步方法我想也是这样的,那么输出却不同步呢?
我知道只要把同步方法和同步代码块的同步监视器都改成this就可以了,但是上面的为什么不行呢?


9 个回复

倒序浏览
张磊 黑马帝 2011-10-15 18:16:34
沙发
public synchronized void output2(String str) {

这个 把 String去掉应该可以了,不知道你明不明白,不明白在回帖
回复 使用道具 举报
张磊 黑马帝 2011-10-15 18:22:20
藤椅
应该还不仅这一个错误,不知道你想干什么,能把全部的贴出来吗
回复 使用道具 举报
我知道,但是上面的为什么不行呢?
回复 使用道具 举报
张磊 黑马帝 2011-10-15 18:26:19
报纸
String s = "";
                public synchronized  void output(String str) {
                        
                                for (int i = 0; i < str.length(); i++) {
                                        System.out.print(str.toCharArray());
                                
                                System.out.println();
                        }
                }
                public synchronized void output2(String str) {
                        for (int i = 0; i < str.length(); i++) {
                                System.out.print(str.toCharArray());
                        }
                        System.out.println();
                }
回复 使用道具 举报
张磊 黑马帝 2011-10-15 18:27:52
地板
我解释一下,第一个方法output方法体内的锁是String对象s第二个是this,不是一个锁怎么可能同步呢
回复 使用道具 举报
余志强 黑马帝 2011-10-15 18:32:40
7#
嗯,我知道,比如当A线程去执行output(String)方法,然后线程B又去执行这个方法,发现有了线程,就不进去了,output2(String)也是这样,虽然这两个同步监视器不一样,但是那里面不是只有一个线程执行吗?那怎么会出现线程不安全呢?求详解
回复 使用道具 举报
余志强 黑马帝 2011-10-15 18:33:44
8#
张磊 发表于 2011-10-15 18:22
应该还不仅这一个错误,不知道你想干什么,能把全部的贴出来吗

代码没有错就是不知道为什么这样?
回复 使用道具 举报
余志强 黑马帝 2011-10-15 18:45:57
9#

知道了
回复 使用道具 举报
张磊 黑马帝 2011-10-15 18:59:56
10#
张磊 发表于 2011-10-15 18:16
public synchronized void output2(String str) {

这个 把 String去掉应该可以了,不知道你明不明白,不明白 ...

这个错了,之前没看清代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马