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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 掉了一地.. 中级黑马   /  2015-3-11 22:45  /  963 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

让线程在程序中稍停 ,使用thread。sleep();
发生了线程安全问题,出现了错误的数据:

问题产生的原因:
1,多个线程在操作共享的数据。
2,线程任务操作共享数据的代码有多条(运算有多个)。

解决思路:
        只要让一个线程在执行线程任务时将多条操作共享的数据的代码执行完,在执行的过程中,不要让其他线程参与运算。就哦了。
java中解决此问题时,是通过代码块来完成的。
同步代码块:synchronized(对象){需要被同步的代码}
同步代码块解决了多线程安全问题。

同步好处:
        解决线程的安全问题。
同步弊端:
        降低了程序的性能。
       
同步前提:必须保证多个线程在同步中使用同一个锁。
解决了什么问题?当多线程安全问题发生时,加入了同步后,问题依旧,就要通过这个同步的前提来判断同步是否写正确。

同步的体现形式:
1,同步代码块:
synchronized (对象obj){
        //代码
}
2,同步函数:
public synchroizd void function(){//同步函数
        //代码
}
       
锁:使用的是this:
同步代码块和同步函数的区别:
同步函数使用的锁是固定的this。
同步代码块使用的锁可以是任意对象。

当线程任务只需要一个同步时可以完全使用同步函数。
同步代码块使用的锁可以是任意对象。当线程任务中需要多个同步时必须通过锁来区分,这是必须使用同步代码块。同步代码块较常用。

静态同步函数:
public static synchroizd void function(){//同步函数
        //代码
}
静态同步函数使用的锁不是this,而是字节码文件。类名.class。

单例懒汉式的并发访问会出现安全隐患:
        并发访问会有安全隐患,饿汉式则不会出现。所以加入同步机制解决安全问题。但同步出现降低了效率。可以通过双重判断的方式,解决效率问题,减少判断的次数。
//懒汉式:
class single{
        private static single s = null;
       
        private Single(){}
       
        public static Single getInstance(){
                if(s==null){
                        synchronized(Single.class){
                                if(s==null)s = new Single();
                                }       
                }
                return  s;
        }

}

同步的另一个弊端:
当线程任务中出现了多个同步(多个锁)时,如果同步中嵌套了其他的同步。
容易产生死锁。

1 个回复

倒序浏览
加油,顶一个!
回复 使用道具 举报 1 0
您需要登录后才可以回帖 登录 | 加入黑马