900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > java多线程学习-实例变量和线程安全

java多线程学习-实例变量和线程安全

时间:2022-05-26 17:02:14

相关推荐

java多线程学习-实例变量和线程安全

自定义线程中的实例变量对其他的线程有共享和不共享之分,对于不共享数据:每个线程都有各自的变量,他们对变量进行各自的管理,不存在多个线程访问同一个变量的情况。

看一个例子:

public class mythread1 extends Thread{public static void main(String[] args) {mythread1 aa =new mythread1("A");mythread1 bb =new mythread1("B");mythread1 cc =new mythread1("C");aa.start();bb.start();cc.start();}private int count =3;public mythread1(String name) {super();this.setName(name);}@Overridepublic void run() {super.run();while(count>0) {count--;System.out.println("线程"+this.currentThread().getName()+" count="+count);}}}

输出:

线程A count=2线程C count=2线程B count=2线程C count=1线程A count=1线程C count=0线程B count=1线程B count=0线程A count=0

线程共享:多个线程可以访问同一个变量,会出现线程不安全的情况。

看一个例子:

public class mythread1 extends Thread{public static void main(String[] args) {mythread1 tt =new mythread1();Thread aa =new Thread(tt,"A");Thread bb =new Thread(tt,"B");Thread cc =new Thread(tt,"C");Thread dd =new Thread(tt,"D");aa.start();bb.start();cc.start();dd.start();}private int count =5;//public mythread1(String name) {//super();//this.setName(name);//}@Overridepublic void run() {super.run();count--;System.out.println("线程"+this.currentThread().getName()+" count="+count);}}

输出:

线程A count=2线程B count=2线程D count=1线程C count=2

有三个线程都打印出count=2,说明同时存在多个线程调用了count,产生了线程安全问题。我们希望看到的结果是各个线程打印出来的count值是依次递减的。

解决方案:

1 使用synchrnized关键字,给run()方法上锁,当其他线程调用时,必须要等到当前线程执行完,把锁释放,在等待的线程在此期间不断尝试获得锁,知道拿到为止。

看一个小例子:

public class mythread1 extends Thread{public static void main(String[] args) {mythread1 tt =new mythread1();Thread aa =new Thread(tt,"A");Thread bb =new Thread(tt,"B");Thread cc =new Thread(tt,"C");Thread dd =new Thread(tt,"D");aa.start();bb.start();cc.start();dd.start();}private int count =5;//public mythread1(String name) {//super();//this.setName(name);//}@Overridesynchronized public void run() {super.run();count--;System.out.println("线程"+this.currentThread().getName()+" count="+count);}}

输出:

线程A count=4线程D count=3线程B count=2线程C count=1

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。