00:00
行,那么折腾了半天了啊,这个S咱们接着往下继续继续啊,不过刚才有个小插曲,我不知道大家有没有听明白啊,就是。其实线程安全搞这个,搞这个线程安全主要就是为了保护这三个变量的安全。一个是实力电量。对吧,我们刚才这个保护谁的安全呀,是不是为了保护这个余额的安全,各位。这个余额的安全,这个余额是在什么地方,是不是在类体当中,我们叫什么变量。实例变量吗?这个对这个实例变量是不是共享的一个数字啊,所以我们要保护它。实例变量才会有现场安全问题,包括我们所说的什么变量,静态变量有现场安全问题,如果是局部变量你就不用谈了,局部变量肯定没有现场安全问题,局部变量是没有线程安全问题的。啊,只要是对这个同学说的对啊,只要是成员变量,因为这个和这个都叫成员变量。只有成员变量,它才会有现场安全问题,局部变量没有。
01:03
啊,静态变量也有也有也有安全问题啊,常量没有啊常量为什么没有现场安全问题。对常量不可修改。常量没有现场的问题啊。局部变量。不会有现成安全问题。局部变量加什么呀,常量啊。不会有线程安全问题,成员变量可能会有线程安全问题。好行吧,那咱们接着往下看吧,这个关了啊,再来一个,我在这里呢,再新建一个package,各位,这个package我们叫th safe safe啊三叫线程安全的第三个包,各位啊,我把这里的代码给它复制一下。
02:12
哎,别复制了,复制这吧,复制这个啊,这个有问题拿过来放到这儿,放到这儿各位啊。好,OK,过来了。过来之后呢,这边呢,我就把这个就删掉了。然后呢,这边呢,我也删了它啊,删了删了注意看啊,我是复制的谁啊来这边删了它。好了,那么test的还是那个test程序,这个呢,还是那个程序啊,各位没动啊,这没有那个synchronized啊,来注意看我们最开始的时候是不是在这个位置加了个synchronized this是不是,哎,大括号,然后接下来在这个位置上是不是加了一个大括号啊。好,我们去执行一下我们这个程序啊,是没问题的。是不是,哎,没问题啊,好,那么接下来我要改造一下各位,我们不用这种方式。
03:04
这种方式不用了。我在这个实例方法上能不能加synchronized呢?我在一个实例方法上加新空,注意啊,变了包变了,各位啊,包变了来。在实例方法上可以使用synchronized吗?答案是可以的,我们看看有没有效果。是不是一样啊,一样对不对,好在这里我要给大家重复一下啊。在哎那锁放哪,那锁放哪,我说一下啊synch ne用用在实例方法上,一定锁的是this。这种方式不灵活啊,Synchron出现的实例方法上说的一定是this啊,没得听,听懂吗?Synchronized出现在。
04:03
实例方法上一定做的是this,没得挑。只能是this,不能是其他的对象了。啊,所以这种方式不灵活啊,不灵活。另外还有一点,另外还有一点,还有一个缺点,SYNCH出现在实例方法上,整个同步的是方法体。注意啊,S出现在什么呀,实例方法上表示整个方法体都需要什么同步啊,都需要同步。可能会无故扩大,无故啊扩大什么同步的范围,导致程序的执行效率降低。
05:07
啊。所以这种方式。不常用。来再执行。可以吧,好,那么再来,各位注意注意听啊注意听。哎,也不一定啊,是吧,来看啊。SNCH的使用在实例方法上有什么优点?使用在实例方法上有什么优点?就是写在方法上有什么有什么好处。啊,就只有一个好处啊,就是代码写的少啊,代码写的比较少啊,代码写的少少了啊,代码写的少了节俭了。
06:08
啊。节俭了叫做。节俭了。明白吧,它也有自己的优点,如果你整个方法都需要同步,并且共享的那个对象一定是this的话,我们建议使用这种方式,各位啊。注意,如果共享的对象就是this,并且需要同步的代码块是整个方法体。建议使用这种方式。明白吧,如果你共享的那个对象就是this,并且你整个方法的方法体都需要同步的话,你就用这种方式,你看多简单。我们来看看润八分。
07:06
好,我们来看看这里边的方法,看见了吗?有没有啊?有没有?有吧?是不是有啊。好,我问大家一个问题啊。我们如果用局部变量的话,选string buffer还是string builder?Buffer是线程安全的。String builder是非线程安全的,但如果我使用局部变量的话。我选string buffer还是选string builder?使用局部变量的话。局部变量,没有什么线程安全问题。使用谁?
08:03
Builder。对吧,哎,使用string builder各位。啊,因为你SYNCH加这么一个东西啊,其实每一次走到这儿之后,他都会去锁池里边走一趟,你懂吗。很麻烦的哦,他就算他不需要等待,听懂了吧,他不需要等待,他也得去锁池里边走一趟。明白了吗?放弃占用的时间片回来再获取,你看它其实会走一圈,所以这个方法呀,其实我们。效率比较低。四准八分。啊,八分来在这里呢。如果。嗯,如果使用局部变量的话。
09:00
建议使用什么?String buffer啊,String builder。啊,因为局部变量。不存在线程安全问题。啊,不存在线程安全问题,选择string builder string buffer,效率比较低。另外呢,大家要注意啊,A list是非线程安全的,Vector是线程安全的。啊哈西麦哈西。啊,是非线程安全的,但哈希table是线程安全的,你都可以看看源代码。
10:04
可以看一下源代码啊,看源代码这我这块我就不再看了,各位啊,我就不再看了。这里主要是说我们在方法上可以使用snchron的synchronized出现在这个位置,那一定它锁的是this啊。并且需要同步的是整个方法体的时候,我们才会使用这种方式。你看是不是,哎,这边都是吧。含。这边的方法有没有SYNCH呢?也有吧,你看。是不是synchronized对吧?啊synchize来我们再执行这个程序啊,行不行。嗯。嗯,可以看是吧。
我来说两句