synchronized同步方法

实例变量非线程安全
public class HasSelfPrivateNum {

   synchronized public void addI (String username){
       int num = 0;   try {
       if (username.equals("a")){
           num=100;
           ViseLog.e("a set over!");

               Thread.sleep(1000);
       }else {
           num=100;

           ViseLog.e("b set over!");
       }

          ViseLog.e(username+num);
           } catch (InterruptedException e) {
               e.printStackTrace();
           }


   }

}
 
public class ThreadA extends Thread {
    private  HasSelfPrivateNum hasSelfPrivateNum;

    public    ThreadA  (HasSelfPrivateNum hasSelfPrivateNum){
        this.hasSelfPrivateNum=hasSelfPrivateNum;
    }
    @Override
    public void run() {
        super.run();
        hasSelfPrivateNum.addI("a");
    }
}
public class ThreadB extends Thread {

    private  HasSelfPrivateNum hasSelfPrivateNum;

    public    ThreadB (HasSelfPrivateNum hasSelfPrivateNum){
        this.hasSelfPrivateNum=hasSelfPrivateNum;
    }
    @Override
    public void run() {
        super.run();
        hasSelfPrivateNum.addI("b");
    }
}
HasSelfPrivateNum  A =  new HasSelfPrivateNum();

ThreadA  a = new ThreadA(A);
a.start();

ThreadB  b  = new ThreadB(A);
b.start();

//  实验结论,在两个线程访问同一个对象那个的同步方法时一定是线程安全的,由于同步访问,所以打印出a,然后打印出b


2.1.3 多个对象多个锁
          HasSelfPrivateNum  A =  new HasSelfPrivateNum();


        ThreadA  a = new ThreadA(A);
        a.start();


        HasSelfPrivateNum  B =  new HasSelfPrivateNum();


        ThreadB  b  = new ThreadB(B);
        b.start();
09-20 15:44:54.025 20265-20319/com.vise.snowdemo E/ViseLog: HasSelfPrivateNum.addI(HasSelfPrivateNum.java:15): a set over!
09-20 15:44:54.025 20265-20320/com.vise.snowdemo E/ViseLog: HasSelfPrivateNum.addI(HasSelfPrivateNum.java:21): b set over!
09-20 15:44:54.025 20265-20320/com.vise.snowdemo E/ViseLog: HasSelfPrivateNum.addI(HasSelfPrivateNum.java:24): b100
09-20 15:44:54.155 17832-19615/? E/HsmCoreServiceImpl: onTransact in code is: 103
09-20 15:44:55.026 20265-20319/com.vise.snowdemo E/ViseLog: HasSelfPrivateNum.addI(HasSelfPrivateNum.java:24): a100
关键字synchronized 取得的锁都是对象锁,而不是把一个把一段代码或者方法当作锁,所以上面事例当中哪个线程先执行带synchronized
的方法,哪个线程就持有该方法所属对象的锁Lock,那么其他的线程只能在等待的状态
2.1.4 synchronized方法和锁的对象
public class MyObject {
    public  void methodA (){
        try {
            Thread.sleep(1000);
            ViseLog.e("begin methA yhreadName= "+Thread.currentThread().getName());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


public class ThreadA extends Thread {
    private MyObject myObject ;
    public    ThreadA  (MyObject myObject){
        this. myObject= myObject;
    }
    @Override
    public void run() {
        super.run();
       myObject.methodA();
    }
}




public class ThreadB extends Thread {


    private MyObject myObject ;
    public    ThreadB  (MyObject myObject){
        this. myObject= myObject ;
    }
    @Override
    public void run() {
        super.run();
        myObject.methodA();
    }
}




    ThreadA  a = new ThreadA(A);
    a.setName("A");
    MyObject  B =  new  MyObject();
    ThreadB  b  = new ThreadB(B);
    b.setName("B");
    a.start();
    b.start();
      A 线程先持有object 对象的Lock锁,B 线程可以异步的方式调用 object 中的 非 synchronized 类型的方法。 
      A 线程先持有object 对象的Lock锁,B 线程如果在这时候调用 object 对象中的 synchronized 方法则需要等待
		
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值