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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 贺洪京 黑马帝   /  2011-9-17 17:11  /  1774 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

麻烦各位帮忙解释一下,在线程安全问题中有一个线程同步函数和线程同步代码块Synchronized 但是两者有什么区别啊?在什么时候用函数,什么时候用代码块呢?

3 个回复

倒序浏览
黑马网友  发表于 2011-9-17 17:31:41
沙发

回复 楼主 的帖子

synchronized是解决线程互斥问题的,当他们指向同一个对象时,那个对象才能实现线程互斥。
而你说的线程同步函数是个什么东东,这个我想请教一下楼主。
回复 使用道具 举报
黑马网友  发表于 2011-9-17 17:41:24
藤椅
线程同步函数就是在普通的函数前边加上synchronized,他和同步代码块是一样的也是当他们指向同一个对象时,来进行的线程互拆,就是下面例子中的sale() 函数那样,但是我就是搞不清楚两个到底有什么区别?
package com.qmxy.lesson9;

public class ThreadDome1 {
        public static void main(String[] args) {
               
       
        TestThread tt=new TestThread();
             new Thread(tt).start();
             try{Thread.sleep(1);}catch(Exception e){}
             tt.st=new String("modth");
             new Thread(tt).start();
        }
}
class TestThread implements Runnable{
        int tick=100;
        String st=new String("");
        public void run(){
                if(st.equals("modth"))
                {
                        while(true){
                                sale();}
                }
                else
                        synchronized(this){
                        if(tick>0)
                        {try{Thread.sleep(10);}catch(Exception e){
                                e.getMessage();
                        }
                System.out.println(Thread.currentThread().getName()+"is slaing tickets...."+tick--);}}
        }
               
        public synchronized void sale(){
                if(tick>0)
                {try{Thread.sleep(10);}catch(Exception e){
                        e.getMessage();
                }
                System.out.println("sale()");
        System.out.println(Thread.currentThread().getName()+"is slaing tickets...."+tick--);}}

        }
回复 使用道具 举报
这两个synchronized都指向了TestThread这个类,所以sele()这个方法和synchronized(this){
                        if(tick>0)
                        {try{Thread.sleep(10);}catch(Exception e){
                                e.getMessage();
                        }
                System.out.println(Thread.currentThread().getName()+"is slaing tickets...."+tick--);}}
        }
是互斥的。

只不过一个是代码块,一个是关键字而已。就像static 代码块和 static关键字一样。如果很多变量都有同一个关键字,那么就可以将这个关键字抽出来变成一个关键字的代码块。
[ 本帖最后由 程辰 于 2011-09-17  17:50 编辑 ]
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马