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

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

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

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

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

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

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

单例对象包括不同的锁:

public class Student {
private String age = "";
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("", "");//占用this锁的方法
try {
System.out.println("i am sleeping");//打印输出我在休眠,一直占用this锁
Thread.currentThread().sleep();//睡眠,一直占用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 =;i<;i++)
{
Thread thread1 = new Thread(appMain);
thread1.start();
}
}
@Override
public void run() {
// TODO Auto-generated method stub
Student.GetInstace().setName("");//调用的是object锁的方法
}

打印继续向下看

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

java多线程知识汇总(三)如何选择锁?如何加锁的更多相关文章

  1. 沉淀,再出发:Java基础知识汇总

    沉淀,再出发:Java基础知识汇总 一.前言 不管走得多远,基础知识是最重要的,这些知识就是建造一座座高楼大厦的基石和钢筋水泥.对于Java这门包含了编程方方面面的语言,有着太多的基础知识了,从最初的 ...

  2. Java多线程学习(六)Lock锁的使用

    系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...

  3. Java多线程学习(三)volatile关键字

    转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79680693 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...

  4. JAVA多线程知识总结(二)

    本文是承接上一篇文章:JAVA多线程知识总结(一) 四.Java多线程的阻塞状态与线程控制  上文已经提到线程阻塞的集中具体类型.下面主要看引起JAVA线程阻塞的方法 1,join()-----让一个 ...

  5. java多线程中的三种特性

    java多线程中的三种特性 原子性(Atomicity) 原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行. 如果一个操作时原子性的,那么多线程并 ...

  6. “全栈2019”Java多线程第二十八章:公平锁与非公平锁详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  7. “全栈2019”Java多线程第十七章:同步锁详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  8. 如何实现有返回值的多线程 JAVA多线程实现的三种方式

    可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口.执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable ...

  9. Java 多线程基础(三) start() 和 run()

    Java 多线程基础(三) start() 和 run() 通过之前的学习可以看到,创建多线程过程中,最常用的便是 Thread 类中的 start() 方法和线程类的 run() 方法.两个方法都包 ...

随机推荐

  1. hive学习(六) 参数和动态分区

    1.hive 参数.变量 1.1hive的命名空间: hive当中的参数.变量,都是以命名空间开头  

  2. MVC 之AjaxHelper

    http://www.cnblogs.com/jyan/archive/2012/07/23/2604958.html 除了传统的Ajax方法之外,MVC提供了AjaxHelper类: Helper ...

  3. Linux平台上SQLite数据库教程(一)——终端使用篇

    https://blog.csdn.net/u011192270/article/details/48031763 https://blog.csdn.net/fml1997/article/deta ...

  4. MP3 Music Library in Tornado

    Web2.0的lab3,使用tornado实现,自己改了改UI 效果 选中播放列表后的效果 原来的图标长得太丑了,有空找些好看点的加进去……以后继续完成extra feature,当复习python了 ...

  5. hdu5984

    听说大佬都是看到1.693147就知道是ln(2)+1我是服气的 不过老老实实推的话就看你大一数分/高数是不是学扎实了 令 把L移到右边并两边求导可得,即 令 代入最开始的公式得到 化简可得,得解 # ...

  6. day6 time和datetime模块

        time模块 time模块提供各种操作时间的函数 #1.时间戳    1970年1月1日之后的秒 #2.元组 包含了:年.日.星期等... time.struct_time #3.格式化的字符 ...

  7. 【51nod】1244 莫比乌斯函数之和

    题解 求积性函数的前缀和?杜教筛! 这不给一发杜教筛入门必备之博客= = https://blog.csdn.net/skywalkert/article/details/50500009 好了,然后 ...

  8. mybatis基础之一

    SqlMapConfig.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE conf ...

  9. 抓包分析LVS-NAT中出现的SYN_RECV

    CIP:192.168.10.193 VIP:192.168.10.152:8000 DIP:100.10.8.152:8000 RIP:100.10.8.101:8000 和 100.10.8.10 ...

  10. Failed to add VMware DC to zone due to : This DC is being managed by other CloudStack deployment.

    1.下载VMware-PowerCLI 2.安装VMware-PowerCLI 安装过程中会重复重启,请确认重启,不要设置稍后手动重启. 3.在开始,菜单中选择 vmware ->VMware ...