java多线程知识汇总(三)如何选择锁?如何加锁

1.锁,保证的是被锁的代码,一次执行完毕才能被其他线程执行,锁保证了一个线程执行过程中不被其他线程打断。以保证数据的准确性。

2。数据的读写过程,是有冲突的,当一个线程正在读数据,另一个线程正在写同一个数据,就有可能导致数据不准确,造成脏数据。就要保证读写分开时间段。即加锁。

3.如果想要保证共享对象的一个方法按序执行,则在这个方法上加锁。

4.多个方法加同一个锁:在多个方法上加同一个锁。如果想保证读写能读取到准确数据,则在同一成员变量的对应读写方法上加同一个锁,同一个锁。保证读写正常。

5.同一个类中加不同的锁,比如一个加的this锁,一个加的object的锁,则此两个方法不受任何影响,多线程可以分别同时运行这两种各方法。

但是如果一个类的躲个方法加同一个锁,则只能按序访问。

下面举例说明,同一个类加不同的锁,一个this锁,一个同步代码块的object的锁。

单例对象包括不同的锁:

public class Student {
    private String age = "12";
    private String name = "Tome";    
    private static Student student = new Student();
    private Object object = new Object();
    
    public void setName(String string) {
        synchronized (object) {
            System.out.println("i am running");
        }    
    }
    synchronized public String getNameAndAge() {
        return name+":"+age;
    }
    synchronized public void setNameAndAge(String name,String age) {
        this.name = name;
        this.age = age;
    }

    private Student()
    {        
    }
    public static Student GetInstace() {
            return student;
    }
}

线程1负责占用单例对象的this锁,且sleep让它一直占用

public class MyThread extends Thread {
    @Override
    public void run() {
        // TODO Auto-generated method stub
        Student.GetInstace().setNameAndAge("111", "111");//占用this锁的方法
        try {
            System.out.println("i am sleeping");//打印输出我在休眠,一直占用this锁
            Thread.currentThread().sleep(500);//睡眠,一直占用this锁,因为调用的是this锁的方法
            System.out.println("i wake up");//打印输出我占用完毕
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

线程2负责执行object同步块代码,同步块调用的是另一个锁,即object锁。

public class AppMain implements Runnable{

    public static void main(String[] args) {
        AppMain appMain = new AppMain();
        MyThread thread2 = new MyThread();
        thread2.start();
        for(int i =0;i<200;i++)
        {
        Thread thread1 = new Thread(appMain);
        thread1.start();    
        }
    }    
    @Override
    public void run() {
        // TODO Auto-generated method stub
        Student.GetInstace().setName("3333");//调用的是object锁的方法
    }

 

 

打印继续向下看

 

结论:同一个类的不同锁,多线程在执行锁住的代码时,多线程不互联影响。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值