黑马程序员技术交流社区

标题: 关于线程安全的问题 [打印本页]

作者: 贺洪京    时间: 2011-9-17 17:11
标题: 关于线程安全的问题
麻烦各位帮忙解释一下,在线程安全问题中有一个线程同步函数和线程同步代码块Synchronized 但是两者有什么区别啊?在什么时候用函数,什么时候用代码块呢?
作者: 匿名    时间: 2011-9-17 17:31
标题: 回复 楼主 的帖子
synchronized是解决线程互斥问题的,当他们指向同一个对象时,那个对象才能实现线程互斥。
而你说的线程同步函数是个什么东东,这个我想请教一下楼主。
作者: 匿名    时间: 2011-9-17 17:41
线程同步函数就是在普通的函数前边加上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--);}}

        }
作者: 程辰    时间: 2011-9-17 17:48
这两个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 编辑 ]




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