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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

同步函数与同步代码块的用法与区别

点评

全部一句话式提问。  发表于 2014-5-19 22:11

5 个回复

倒序浏览
同步代码块
格式:
synchronized(对象)
{
//需要被同步的代码;
}

同步:
好处:解决了多线程的安全问题。
弊端:降低了效率。

同步的前提:
1,至少有两个线程在同步中。
2,必须保证同步使用的是同一个锁。

同步函数。
public synchronized void test()//同步函数。
同步函数使用的锁,应该是this。

同步函数和同步代码块的区别?
同步函数使用的固定锁this。
同步代码块使用的锁是可以指定的。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报

用两个线程进行:卖票

class Ticket implements Runnable
{
        //将票私有500张票
        private int tick = 500;
       
        //定义一个标记,用来调用两个线程
        boolean flag = true;
       
        //覆盖runnable中的run方法
        public void run()
        {
                if(flag)
                {
                        //打印车票
                        while(true)
                        {
                               
                                //如果show方法被静态修饰,这里调用的对象是Ticket.class
                                synchronized(this)//因为run方法调用的show()方法,show方法调用的是this.所以这里是this
                                {
                                        if(tick>0)
                                        {
                                                try{Thread.sleep(10);}catch(Exception e){}
                                                System.out.println(Thread.currentThread()+"同步售票"+tick--);
                                        }
                                }
                        }
                }
                else
                        while(true)
                                show();
        }
       
        //对操作共享数据的代码块进行封装
        public synchronized void show()
        {
                if(tick>0)
                {
                        try{Thread.sleep(10);}catch(Exception e){}
                        //currentThread();获取线程名称
                        System.out.println(Thread.currentThread()+"..同步函数售票.."+tick--);
                }
        }
       
}
public class _线程同步 {
       
        public static void main(String[]args)
        {
                Ticket t = new Ticket();
               
                //创建线程
                Thread t1 = new Thread(t);
                Thread t2 = new Thread(t);
               
                t1.start();
               
               
                //当主函数执行到这儿时,让它停留10秒;原因是,main主函数线程会瞬间将两个线程开启执行,
                //所以当线程执行到t.falg=false时,会直接执行到show方法
                try{Thread.sleep(10);}catch(Exception e){}
                t.flag = false;
                t2.start();
               
        }
}



通过例子说明:
同步函数使用的锁是this.
降低了线程安全问题,提高了效率

而同步代码块
格式:
synchronized(对象)
{
被同步的代码;
}
它解决了多线程的安全问题。但效率比较低。

评分

参与人数 1技术分 +1 收起 理由
李小然 + 1

查看全部评分

回复 使用道具 举报
同步代码块的锁可以是任意对象。
同步函数的锁是固定的this锁,可以简化书写。不考虑锁的话,分别不大。
回复 使用道具 举报
学到好多~~
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马