synchronized初步

有如下代码:

public class NameAndPsw {
    private String name = "name";
    private String psw = "psw";

    synchronized public void setsth (String n,String p){
        this.name = n;
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        this.psw = p;
         System.out.println("更新操作完成!");
    }

    synchronized public void getsth(){
        System.out.println("name:"+name+"   psw:"+psw);
    }
}

public class ThreadA extends Thread{
    NameAndPsw nameAndPsw;

    public ThreadA(NameAndPsw n){
        this.nameAndPsw = n;
    }
    @Override
    public void run() {
        nameAndPsw.setsth("new name","new psw");
    }
}

public class ThreadB extends Thread{
    NameAndPsw nameAndPsw;

    public ThreadB(NameAndPsw n){
        this.nameAndPsw = n;
    }
    @Override
    public void run() {
        nameAndPsw.getsth();
    }
}

public class Main {
    public static void main(String[] args) {
        NameAndPsw nameAndPsw = new NameAndPsw();
        Thread threadA = new ThreadA(nameAndPsw);
        Thread threadB = new ThreadB(nameAndPsw);
        threadA.start();
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        threadB.start();
    }
}
有NameAndPsw类,其中有更新用户名密码的函数,有获取用户名密码的函数。
A线程更新用户名密码,B线程获取用户名密码。
这里使用synchronized避免了读取脏数据的情况。
如果没有加上synchronize关键字,更新用户名密码的过程中,线程睡眠了,此时获取用户名密码的线程去执行。就会出现脏读现象。
加上该关键字之后,因为拥有了对象锁,所以读取线程并不能执行,不会出现脏读现象。
使用synchronized关键字同步一个明显的特点是:MyObject类中定义有多个synchronized修饰的实例方法时,若多个线程拥有同一个MyObject类的对象,则这些方法只能以同步的方式执行。即,执行完一个synchronized修饰的方法后,才能执行另一个synchronized修饰的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值