首页 > 代码库 > java线程不安全
java线程不安全
线程不安全之线程在访问资源时候会导致冲突。
例如下列的例子
package com.test.thread; public class TestConfilict { /** * @param args */ public static void main(String[] args) { Counter counter=new Counter(); for(int i=0;i<10000;i++) { (new TestThread(counter)).start(); } } } class TestThread extends Thread { private Counter counter; public TestThread(Counter counter) { this.counter=counter; } public void run() { counter.add(1); System.out.println(counter.get()); } } class Counter { protected int count=0; public void add(int value) { count=count+value; count=count+value; count=count+value; count=count+value; count=count+value; count=count+value; count=count+value; count=count+value; count=count+value; count=count+value; } public int get() { return count; } }
我们看结果可以发现
我们可以看到,输出结果都不相同,而且,都不是100000,这说明了线程不安全,也就是对同一个资源进行操作的时候,产生了冲突,具体来说,就是在增加的时候,因为没有资源保护,导致多个线程同时进入了增加的代码。
那么,我们可以采用加锁的方式来解决问题。
package com.test.thread; public class TestConfilict { /** * @param args */ public static void main(String[] args) { Counter counter=new Counter(); for(int i=0;i<10000;i++) { (new TestThread(counter)).start(); } } } class TestThread extends Thread { private Counter counter; public TestThread(Counter counter) { this.counter=counter; } public void run() { counter.add(1); System.out.println(counter.get()); } } class Counter { protected int count=0; public synchronized void add(int value) { count=count+value; count=count+value; count=count+value; count=count+value; count=count+value; count=count+value; count=count+value; count=count+value; count=count+value; count=count+value; } public int get() { return count; } }
我们可以看到,输出结果
而且每次都是相同的,说明用加锁的方式,使得线程安全了。
java线程不安全
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。