美文网首页
2.1synchronized同步方法

2.1synchronized同步方法

作者: 农家男孩 | 来源:发表于2017-07-02 21:36 被阅读0次

“线程安全”与“非线程安全”相关的技术点,它们是学习多线程技术时一定会遇到的经典问题。“非线程安全”其实会在多个线程对同一个对象中的实例变量进行并发访问是发生时发生,产生的后果就是“脏读”,也就是取到的数据其实是被更改过的。,而"线程安全"就是以获得的实例变量的值是经过同步处理的,不会出现脏读的现象。

2.1.1方法内的变量

“非线程安全”问题存在于“实例变量”中,如果是方法内部的私有变量则不存在“非线程安全”问题,所得结果也就是“线程安全”的了。

/**
 * @author wuyoushan
 * @date 2017/4/4.
 */
public class HasSelfPrivateNum {
    public void addI(String username){
        try {
            int num = 0;
            if (username.equals("a")) {
                num = 100;
                System.out.println("a set over!");
                Thread.sleep(200);
            }else{
                num=200;
                System.out.println("b set over!");
            }
            System.out.println(username+" num="+num);
        }catch (Exception ex){
            ex.printStackTrace();
        }
    }
}

文件ThreadA.java代码如下:

/**
 * @author wuyoushan
 * @date 2017/4/4.
 */
public class ThreadA extends Thread{

    private HasSelfPrivateNum numRef;

    public ThreadA(HasSelfPrivateNum numRef){
        super();
        this.numRef=numRef;
    }

    @Override
    public void run() {
        super.run();
        numRef.addI("a");
    }
}

文件ThreadB.java代码如下:

/**
 * @author wuyoushan
 * @date 2017/4/4.
 */
public class ThreadB extends Thread{

    private HasSelfPrivateNum numRef;

    public ThreadB(HasSelfPrivateNum numRef){
        super();
        this.numRef=numRef;
    }

    @Override
    public void run() {
        super.run();
        numRef.addI("b");
    }
}

/**
 * @author wuyoushan
 * @date 2017/3/20.
 */
public class Run {
    public static void main(String[] args){
       HasSelfPrivateNum numRef=new HasSelfPrivateNum();
        ThreadA threadA=new ThreadA(numRef);
        threadA.start();

        ThreadB threadB=new ThreadB(numRef);
        threadB.start();
    }
}

运行结果如下:

a set over!
b set over!
b num=200
a num=100

摘选自 java多线程核心编程技术-2.1

相关文章

  • 2.1synchronized同步方法

    “线程安全”与“非线程安全”相关的技术点,它们是学习多线程技术时一定会遇到的经典问题。“非线程安全”其实会在多个线...

  • java同步线程(二)

    java同步线程(二) 同步方法: 使用synchronized关键字来修饰某个方法,则该方法称为同步方法。同步方...

  • 高并发编程基础

    1.同步方法锁定的是锁对应的其它同步方法,不影响调用非同步方法或其它锁对应的同步方法。 2.同步方法只能保证当前方...

  • 多线程之线程同步

    同步的方法: 1.Java 同步关键字(synchronized) 实例方法实例方法同步是同步在拥有该方法的对象上...

  • 释放锁的三种情况

    1.执行完同步方法或同步代码块 2.在同步方法或同步代码块中调用wait方法 3.在同步方法或同步代码块中发生异常...

  • 【synchronized】同步方法与同步块

    这里我们分三块来解读学习: 同步方法思想同步块思想同步方法与同步块的区别 1. 同步方法思想 上面是我画的同步方法...

  • Synchronized锁 偏向锁 锁优化

    Synchronized实现同步 同步普通方法,锁当前实例对象 同步静态方法,锁当前类的Class对象 同步方法块...

  • 2020-07-27 同步方法解决线程安全问题

    2.同步方法 1.使用同步方法解决实现Runnable接口方法解决线程同步安全问题 2.使用同步方法解决继承Thr...

  • 理解synchronized

    实例同步方法 静态同步方法 实例同步方法块 静态同步方法快 每一个类都对应一个Class对象,这个Class对象只...

  • 从一道面试题引申出的java锁机制原理

    面试题: 两个同步方法a、b,问在方法a中是否可以顺利访问方法b 答案:可以。 同步方法 同步方法是在方法签名上有...

网友评论

      本文标题:2.1synchronized同步方法

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