本文详细介绍了Java线程同步的概念和常用方法,重点介绍了同步块和同步函数。
什么是1线程同步
线程同步:当一个线程正在操作一个内存时,其他线程无法操作该内存地址。 在该线程完成操作之前,其他线程无法操作该内存地址,其他线程处于等待状态。 这种线程访问数据的模式称为线程同步。
2同步前提
多个线程运行时访问共享数据时需要同步,而单线程则不需要同步。
多个线程是否在运行时使用相同的锁定? 嗯,是的否则就不是同步了。
3 Java如何实现线程同步
线程同步的方法有很多,这里介绍六种常用的方法。
同步方法
也就是说,有同步关键字修饰的方法。 因为java中的每个对象都有一个内置锁,所以当使用该关键字限定方法时,整个方法都受到内置锁的保护。 在调用此方法之前,必须获取内置锁。 如果不获取,将处于阻塞状态。
注:同步关键字还可以限定静态方法。 在这种情况下,调用静态方法将锁定整个类。
同步代码块
也就是说,有一个用同步关键字限定的语句块。 用该关键字限定的语句块将自动进行内置锁定和同步。
使用特殊域变量volatile进行线程同步
volatile关键字提供了一种解锁对共享变量的访问的机制。 使用volatile限定域等效于告诉虚拟机该域可能由其他线程更新,因此每次使用域时都必须重新计算寄存器中的值,而不是使用寄存器中的值。 volatile禁止排序,但不提供原子操作,也不能用于限定final类型的变量。
因此,volatile可用于本机操作的共享变量的数据同步,但对于非本机操作无效。
使用JUC提供的各种锁定进行线程同步
例如,同步化对JUC的锁定更灵活。
重复锁定; 可重锁.互斥锁
ReentrantReadWriteLock可以重新进入锁定.读/写锁定
使用JUC的块队列进行线程同步
一次只能有一个线程修改队列中的数据,从而确保队列安全,并确保在较低级别使用或使用的锁定。
使用JUC原子变量的线程同步
java.util.concurrent.atomic包包含一个类小工具,支持线程安全编程,通过单个变量解除锁定。 基本上使用cas自由锁定机构操作变量volatile修饰变量,保证操作的可见性和原子性,禁止指令重新排列。
3.1同步块
使用同步块解决数据安全问题:
同步(obj ) { //obj被称为同步监视器,也称为同步锁定
//操作的共享数据
}
上面的代码意味着线程必须在开始执行同步代码块之前获取同步监视器的锁定。 一次只能获取同步监视器的锁定,而sleep线程不会解除同步锁定。 同步代码块执行完成后,线程将解除同步监视器的锁定。
必须注意多个线程,并使用相同的锁定。 否则,“锁定”就不起作用。
3.2同步函数
使用同步函数(方法)解决数据安全问题。
公共(静态)同步语音xx ) {
//文1;
//文2;
}
3.3同步块和同步函数的优缺点
共同的优缺点:
优点:线程同步解决了数据安全问题。
缺点:如果线程很多,则确定每个线程每次运行时都会获取同步锁定。 这将消耗资源,降低执行效率。
同步块的优点:
自定义锁定范围。
锁定对象可以是除null以外的任何对象,但必须是相同的锁定对象。
如果线程同步需要使用多个锁定对象,则只能使用同步块。
同步块缺点:
代码水平提高了。
同步函数的优点:
使用方便,减少了代码的层次。
同步函数的缺点:
锁定对象是默认的。 在常规方法中,锁定对象是this锁定。 静态方法是字节码文件对象。
的范围是整个方法,不灵活。
这篇文章在博客“l-Java”(csdn )上同时发布。
如果有侵权,请联系support@oschina.cn将其删除。
本文加入《OSC源创计划》,欢迎正在阅读的你也加入,一起分享。