美文网首页
8-线程安全问题_多线程中的共享变量

8-线程安全问题_多线程中的共享变量

作者: 加碘盐_ed6c | 来源:发表于2018-05-06 16:10 被阅读0次

出问题了,共享变量

我们先来看一段代码

public class Main {
    public static void main(String[] args) throws InterruptedException {
       TheThread theThread1=new TheThread();
        TheThread theThread2=new TheThread();
        theThread1.start();
        theThread2.start();
    }
    static int  i = 0;
    public static class TheThread extends Thread{
        public void run(){
           for(;i<100;){
                i++;
                System.out.println(Thread.currentThread().getId()+":"+i);
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

这个运行的最终结果本来应该是200,但是结果远远小于200,如果循环次数越多,则结果差距越大,这是为什么呢?

当一个线程区访问这个变量的时候,另外的线程也可以访问,在修改值得时候,存在同时修改的可能性,这时候i只能被赋值一次,这就导致了一个问题。这个问题我们叫做线程安全问题。这个变量我们称作共享变量。

解决问题:同步

并发中,共享变量会导致的一个问题就是线程安全问题,为了解决这个问题,我们要做的就是控制线程访问。在一个线程在访问的这个共享资源的时候,其他线程无法访问,这就是同步。

Java为了解决同步问题,专门设置了关键字,叫synchronized,我们来写一个线程安全的代码:

public class Main {
    public static void main(String[] args) throws InterruptedException {
        int i=0;
        ObjA o=new ObjA(i);
        TheThread theThread1=new TheThread(o);
        TheThread theThread2=new TheThread(o);
        theThread1.start();
        theThread2.start(); 
    }
}
class TheThread extends Thread { 
      private ObjA objA;
      public TheThread(ObjA objA) {
          this.objA=objA;
      } 
      public void run() { 
          objA.method(); 
      }
 }

class ObjA{
      int i;
      public ObjA(int i) { 
          this.i=i; 
      }
      synchronized public void method() {
            for(int j=0;j<50;j++) {
                i++;
                System.out.println(i);
        }
    }
}

相关文章

  • 8-线程安全问题_多线程中的共享变量

    出问题了,共享变量 我们先来看一段代码 这个运行的最终结果本来应该是200,但是结果远远小于200,如果循环次数越...

  • ThreadLocal解析

    原理 产生线程安全问题的根源在于多线程之间的数据共享。如果没有数据共享,就没有多线程并发安全问题。ThreadLo...

  • ThreadLocal解析

    原理 产生线程安全问题的根源在于多线程之间的数据共享。如果没有数据共享,就没有多线程并发安全问题。ThreadLo...

  • iOS 多线程技术有些啥,如何解决多线程带来的隐患

    有多线程就有因为多线程造成的数据安全问题(如何确保同一块共享内存在多线程下不发生数据错乱和数据安全问题) 线程同步...

  • 五 异常与多线程——第三节 线程同步机制

    1、线程安全问题的概述 多线程访问了共享的数据,就会产生线程安全问题 2、线程安全问题的代码实现 输出:会出现重复...

  • 2020-09-15 Java线程安全

    一、线程安全简介 单线程程序不会产生线程安全问题。多线程程序没有访问共享数据,也不会产生问题。多线程程序访问共享数...

  • 多线程

    打印正在运行的多个线程 通过继承的方式实现线程 多线程共享全局变量 多线程共享全局变量 args参数 互斥锁 如果...

  • 18_线程安全_同步机制_锁

    多线程访问共享数据 造成安全问题 造成安全问题的原因 ==================锁 解决线程安全的方式 ...

  • 锁(synchronized)

    synchronized 在并发编程中存在线程安全问题,主要原因有:1.存在共享数据 2.多线程共同操作共享数据。...

  • JAVA学习笔记之 多线程卖票

    多线程程序出现安全问题的原因:A:是多线程程序。B:有共享数据。C:针对共享数据有多条语句操作。 现在的程序存在着...

网友评论

      本文标题:8-线程安全问题_多线程中的共享变量

      本文链接:https://www.haomeiwen.com/subject/iysurftx.html