我的理解是 Java 允许线程访问共享变量。通常,为了确保共享变量持续更新,线程应该通过获取对这些共享变量强制互斥的锁来确保它独占使用这些变量。如果一个字段被声明为 volatile,在这种情况下,Java 内存模型确保所有线程看到变量的一致值。
在下面的程序中,ticectsAvailable是一个存储在堆上的共享变量,因为 thread1 和 thread2 是在同一个对象“ obj ”上创建的,所以 thread1 和 thread2 都可以访问 obj
我试图了解何时使变量变得易变。在这种情况下,正确的用例将在这里使“ticketsAvailable”变得不稳定。我对 volatile 变量的理解正确吗?
我读过一篇文章说:出于性能原因,每个线程在处理变量时可能会将变量从主内存复制到 CPU 缓存中。如果您的计算机包含多个 CPU,则每个线程可能运行在不同的 CPU 上。这意味着,每个线程都可以将变量复制到不同 CPU 的 CPU 缓存中
在这种情况下,如果我不使“tickectsAvailable”不稳定,如果我有多个线程处理同一对象(“obj”),并且只有一个以上的 CPU,那么线程可能会从 CPU 缓存中读取更改?
仅当您的计算机包含多个 CPU 时才应使用易失性变量吗?但是,如果我在同一个 obj 和一个 cpu 上有多个线程,它将如何表现?
class TicketBooking implements Runnable{
int ticketsAvailable=1;
public void run(){
System.out.println("Waiting to book ticket for : "+Thread.currentThread().getName());
synchronized (this) {
if(ticketsAvailable>0){
System.out.println("Booking ticket for : "+Thread.currentThread().getName());
//Let's say system takes some time in booking ticket (here we have taken 1 second time)
try{
Thread.sleep(1000);
}catch(Exception e){}
ticketsAvailable--;
System.out.println("Ticket BOOKED for : "+ Thread.currentThread().getName());
System.out.println("currently ticketsAvailable = "+ticketsAvailable);
}
else{
System.out.println("Ticket NOT BOOKED for : "+
Thread.currentThread().getName());
}
}//End synchronization block
}
}
qq_花开花谢_0
回首忆惘然
相关分类