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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 我是刘通 中级黑马   /  2015-10-9 23:59  /  167 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

同步函数
函数和同步代码块都是封装,两者结合就是同步函数
把synchronized关键字作为修饰符放在函数上就实现了同步函数,无需对象锁
将需要同步的代码单独封装为一个函数,并加上synchronized关键字就实现了同步函数
函数需要被对象调用,那么函数都有一个所属对象的引用就是this,所以同步函数使用的锁是this
[java] view plaincopy  
1.        class Ticket implements Runnable  
2.        {  
3.            private int tick=100;  
4.            Object obj = new Object();  
5.            public void run()  
6.            {  
7.                while(true)  
8.                {  
9.                    show();  
10.                }  
11.            }  
12.          //直接在函数上用synchronized修饰即可实现同步  
13.        public synchronized void show()  
14.        {  
15.                if(tick>0)  
16.                {  
17.                try  
18.                {     
19.                    //使用线程中的sleep方法,模拟线程出现的安全问题  
20.                    //因为sleep方法有异常声明,所以这里要对其进行处理  
21.                    Thread.sleep(10);  
22.                }  
23.                catch (Exception e)  
24.                {  
25.                }  
26.                //显示线程名及余票数  
27.                System.out.println(Thread.currentThread().getName()+"..tick="+tick--);  
28.            }  
29.        }     
30.        }  
静态同步函数的锁
同步函数被静态static修饰后,使用的锁不是this,因为静态方法中不可以定义this。静态进内存时,内存中没有本类对象,但是一定有该类对应的字节码文件对象:类名.class,该对象的类型是Class
静态的同步方法,使用的锁是该方法所在类的字节码文件对象,也就是类名.class
参阅单例设计模式-懒汉式
[java] view plaincopy  
1.        class Single  
2.        {  
3.            private static Single s = null;  
4.            private Single(){}  
5.            public static Single getInstance()  
6.            {  
7.                if(s==null)  
8.                {  
9.                    synchronized(Single.class)  
10.                    {  
11.                        if(s==null)  
12.                            s = new Single();  
13.                    }  
14.                }  
15.                return s;  
16.            }  
17.        }//同步代码块加入判断的原因:如果第一个线程进入到第一个if代码块,此时并还没获取锁,此时虚拟机切换给第二个线程,它也进来了if代码块,并且此时获取锁,new一个对象,然后返回。接着虚拟机切换给第一个线程,它这时候才获取锁,此时如果没有第二个if判断,就会再new 一个对象,这就不能保证类的对象唯一性。

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马