轻量级前端框架助力开发者提升项目效率与性能
1324
2022-10-26
【多线程】——synchronized关键字
synchronized是Java中的关键字,意思为同步,通常在Java中用于多线程的场景下,代表着同步锁。可以修饰方法,变量。简单理解如果使用了在方法上或者在代码块上使用代表,无论哪个线程只要每次调用同一个对象并且运行使用synchronized修饰代码都需要验证有没有正在使用这段代码的线程,如果有则需要等其他线程之后完成后才能继续调用。
什么时候需要使用synchronized?
如果多个线程同时访问同一个对象中实例变量,则由可能出现“非线程安全”问题。非线程安全问题最经典就是车站卖票,本来只有100张票,结果卖个的人数为100+,此时就是多个线程共享一个实例变量造成的问题。
为了保证线程的安全,引入synchronized,当多个线程同时操作一个实例变量的时候排序依次进行操作,这样就不会出现多个线程同时操作的情况,线程此时是安全的。
注意:只有涉及到共享资源的读写才需要同步化
synchronized使用方式
1、类锁
synchronized修饰带有static的方法,或者同步代码块中括号中内容为class的时候是类锁,针对该类的所有实例化对象的线程都有作用,排队进行。每个实例化对象直接需要排队进行。
synchronized public static void test() { System.out.println("我是类锁"); }
public void classLock() { synchronized (LockClass.class) { System.out.println("我是类锁"); }}
2、对象锁
synchronized修饰普通方法或者变量都是对象锁,仅针对使用该对象的线程需要排队。
synchronized public void objectFunctionLock() { System.out.println("我是普通方法对象锁"); } private Object object = new Object(); public void objectVariableLock() { synchronized (object) { System.out.println("我是变量对象锁"); } }
3、同步不具有继承性
4、支持可重入锁
当一个线程得到一个对象锁后,再次请求此对象锁时可以再次得到该对象的锁,就是一个线程中多个锁方法连续调用,依旧可以获得锁,即为可重入锁。可重入锁支持父子继承关系中。
5、同步代码块
当一个方法中有同步代码块,此方法支持一部分异步,加锁的一部分同步,这样可以缓解一部分因为同步锁造成的运行时间缓慢的问题,只在需要的地方才加同步代码块。
6、synchronized(this)和synchronized(非this)
这一部分看到很多人都在纠结,其实很简单括号中放的是什么对象就锁住什么对象,this就是当前对象本身,非this就是自身以外的其他内容,可能就是成员变量之类的内容。只要成员变量指向的位置不发生变化,里面的属性随便变,都不影响当前对象当做锁来使用。
总结
好好的去理解,去实践,远比想象中的简单很多!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~