java多线程知识汇总(三)如何选择锁?如何加锁
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多线程知识汇总(三)如何选择锁?如何加锁的更多相关文章
- 沉淀,再出发:Java基础知识汇总
沉淀,再出发:Java基础知识汇总 一.前言 不管走得多远,基础知识是最重要的,这些知识就是建造一座座高楼大厦的基石和钢筋水泥.对于Java这门包含了编程方方面面的语言,有着太多的基础知识了,从最初的 ...
- Java多线程学习(六)Lock锁的使用
系列文章传送门: Java多线程学习(二)synchronized关键字(1) Java多线程学习(二)synchronized关键字(2) Java多线程学习(三)volatile关键字 Java多 ...
- Java多线程学习(三)volatile关键字
转载请备注地址:https://blog.csdn.net/qq_34337272/article/details/79680693 系列文章传送门: Java多线程学习(一)Java多线程入门 Ja ...
- JAVA多线程知识总结(二)
本文是承接上一篇文章:JAVA多线程知识总结(一) 四.Java多线程的阻塞状态与线程控制 上文已经提到线程阻塞的集中具体类型.下面主要看引起JAVA线程阻塞的方法 1,join()-----让一个 ...
- java多线程中的三种特性
java多线程中的三种特性 原子性(Atomicity) 原子性是指在一个操作中就是cpu不可以在中途暂停然后再调度,既不被中断操作,要不执行完成,要不就不执行. 如果一个操作时原子性的,那么多线程并 ...
- “全栈2019”Java多线程第二十八章:公平锁与非公平锁详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java多线程第十七章:同步锁详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- 如何实现有返回值的多线程 JAVA多线程实现的三种方式
可返回值的任务必须实现Callable接口,类似的,无返回值的任务必须Runnable接口.执行Callable任务后,可以获取一个Future的对象,在该对象上调用get就可以获取到Callable ...
- Java 多线程基础(三) start() 和 run()
Java 多线程基础(三) start() 和 run() 通过之前的学习可以看到,创建多线程过程中,最常用的便是 Thread 类中的 start() 方法和线程类的 run() 方法.两个方法都包 ...
随机推荐
- Codefroces 735D Taxes(哥德巴赫猜想)
题目链接:http://codeforces.com/problemset/problem/735/D 题目大意:给一个n,n可以被分解成n1+n2+n3+....nk(1=<k<=n). ...
- 洛谷 P1652圆 题解
题目传送门 这道题也就是考你对几何的了解: 圆与圆没有公共点且一个圆在另一个圆外面时,叫做圆与圆相离. 当圆心距大于两圆半径之和时,称为两圆外离: 当圆心距小于两圆半径之差的绝对值时,称为两圆内含. ...
- python开发学习-day07(面向对象之多态、类的方法、反射、新式类and旧式类、socket编程)
s12-20160227-day07 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...
- [实战]MVC5+EF6+MySql企业网盘实战(11)——新建文件夹2
写在前面 上篇文章实现了创建文件夹的功能,这里面将实现单击文件夹,加载列表的功能. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网 ...
- 【LOJ】 #2013. 「SCOI2016」幸运数字
题解 最大异或和,明显是个线性基 然而还有那么多路径--那就树分治,反正点数看起来很少,就是为了让人乘上一个60的常数嘛 把一个树的点分树记录下来,然后看看询问的两个点彼此相同的最后一个父亲是谁,把这 ...
- 【LOJ】#2172. 「FJOI2016」所有公共子序列问题
题解 听说是什么序列自动机? 我们考虑对于每个位置的串,下面拼接相同的字符时,拼接最近的一个,这样可以保证不重不漏 为了实现这个我们需要什么呢,我们需要一个链表,记录一下每个位置的下一个字符会转移到哪 ...
- web_reg_save_param_regexp函数的用法
关联从服务器返回的所有的内容: 本例通过一个使用HTTP/HTML协议发送.获取服务器数据的vuser脚本,分析LoadRunner如何进行HTTP关联. 下面这个例子包括两个事务:上传数据到服务器. ...
- 字符串处理strcpy strcat函数的用法
C语言函数字符串处理strcpy strcat函数的用法: 1)strcat是用来连接两个字符串的,原型是char *strcat(char *dest,char *src),作用是把src所指字符串 ...
- 【WPF】WriteableBitmap和BitmapImage的相互转换
public BitmapImage ConvertWriteableBitmapToBitmapImage(WriteableBitmap wbm) { BitmapImage bmImage = ...
- Python 爬虫笔记(三)
from selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains #Act ...