JAVA 程序多线程

JAVA 程序多线程,第1张

public class ThreadTest implements Runnable{

private String flag;

public void setFlag(String flag) {

thisflag = flag;

}

public void run() {

for (int i = 10; i > 0; i--) {

Systemoutprintln(flag+i);

}

}

public static void main(String[] args) {

ThreadTest a=new ThreadTest();

ThreadTest b=new ThreadTest();

asetFlag("线程a:");

bsetFlag("线程b:");

Thread t=new Thread(a);

Thread t2=new Thread(b);

t2setPriority(ThreadMAX_PRIORITY);

tstart();

t2start();

}

}

publicclassDoubleThread{\x0d\publicstaticvoidmain(String[]args){\x0d\Threadt1=newThread(){\x0d\@Override\x0d\publicvoidrun(){\x0d\for(chari='a';i回答于 2022-12-14

21读一致性

Java 中针对上述“读不安全”的问题提供了关键字 volatile 来解决问题,被 volatile 修饰的成员变量,在内容发生更改的时候,会通知所有线程去主内存更新最新的值,这样就解决了读不安全的问题,实现了读一致性。

但是,读一致性是无法解决写一致性的,虽然能够使得每个线程都能及时获取到最新的值,但是11中的写一致性问题还是会存在。

既然如此,Java 为啥还要提供 volatile 关键字呢?这并非多余的存在,在某些场景下只需要读一致性的话,这个关键字就能够满足需求而且性能相对还不错,因为其他的能够保证“读写”都一直的办法,多多少少存在一些牺牲。

22写一致性

Java 提供了三种方式来保证读写一致性,分别是互斥锁、自旋锁、线程隔离。

221互斥锁

互斥锁只是一个锁概念,在其他场景也叫做独占锁、悲观锁等,其实就是一个意思。它是指线程之间是互斥的,某一个线程获取了某个资源的锁,那么其他线程就只能睡眠等待。

在 Java 中互斥锁的实现一般叫做同步线程锁,关键字 synchronized,它锁住的范围是它修饰的作用域,锁住的对象是:当前对象(对象锁)或类的全部对象(类锁)——锁释放前,其他线程必将阻塞,保证锁住范围内的 *** 作是原子性的,而且读取的数据不存在一致性问题。

对象锁:当它修饰方法、代码块时,将会锁住当前对象

类锁:修饰类、静态方法时,则是锁住类的所有对象

注意: 锁住的永远是对象,锁住的范围永远是 synchronized 关键字后面的花括号划定的代码域。

222自旋锁

自旋锁也只是一个锁概念,在其他场景也叫做乐观锁等。

自旋锁本质上是不加锁,而是通过对比旧数据来决定是否更新:

以上就是关于JAVA 程序多线程全部的内容,包括:JAVA 程序多线程、多线程的java 程序如何编写、在 Java 程序中怎么保证多线程的运行安全等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9302832.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-26
下一篇2023-04-26

发表评论

登录后才能评论

评论列表(0条)

    保存