package 多线程技能1;
/**
实例变量共享造成的非线程安全问题与解决方案
*/
class MyTheard extends Thread{
private int count =5;
public MyTheard(String name){
super();
//设置线程姓名
this.setName(name);
}
@Override
synchronized public void run() {
super.run();
count--;
System.out.println("由"+currentThread().getName()+"计算,count="+count);
/*
线程安全的
*/
while (count>0){
count--;
System.out.println("由"+currentThread().getName()+"计算,count="+count);
}
}
}
public class T128 {
public static void main(String[] args) {
// MyTheard myTheard=new MyTheard();
/**
* JVM中count--操作被分为三步 ,非原子性 造成线程非安全的主要原因
* 1)取得count的值
* 2)计算count-1
* 3)对count进行赋值
*/
// Thread thread=new Thread(myTheard,"A");
// Thread thread1=new Thread(myTheard,"B");
// Thread thread2 =new Thread(myTheard,"C");
// Thread thread3=new Thread(myTheard,"D");
// Thread thread4=new Thread(myTheard,"E");
// thread.start();
// thread1.start();
// thread2.start();
// thread3.start();
// thread4.start();
MyTheard myTheard=new MyTheard("A");
MyTheard myTheard1=new MyTheard("B");
MyTheard myTheard2=new MyTheard("C");
// start 的顺序不代表run的顺序 但是count是各自的
myTheard.start();
myTheard1.start();
myTheard2.start();
}
}
/**
*synchronized可以对任意对象进行加锁,加锁区域称为“互斥区”或者“临界区”
* 当一个线程想要执行同步方法里面的代码时,线程会首先尝试去申请这把锁,
* 如果能够申请到这把锁,那么就会执行上一年吃肉则对里面的代码。如果不能
* 申请到这把锁,那么这个线程就会不断尝试去申请这把锁,知道申请到为止,而
* 且多个线程会同时去争抢这把锁。
*/