Synchronized的两种用法
时间:2019-01-18
本文章向大家介绍Synchronized的两种用法,主要包括Synchronized的两种用法使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1.对象锁
- 方法锁(默认锁对象为this当前实例对象)
public class Demo3 implements Runnable{
static Demo3 demo2=new Demo3();
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread t1=new Thread(demo2);
Thread t2=new Thread(demo2);
t1.start();
t2.start();
while(t1.isAlive()||t2.isAlive()) {
}
System.out.println("finished");
}
@Override
public void run() {
// TODO Auto-generated method stub
method();
}
public synchronized void method() {
synchronized(this) {
System.out.println("现在是对象方法锁的形式:"+Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"已经运行结束");
}
}
}
public class Demo2 implements Runnable{
static Demo2 demo2=new Demo2();
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread t1=new Thread(demo2);
Thread t2=new Thread(demo2);
t1.start();
t2.start();
while(t1.isAlive()||t2.isAlive()) {
}
System.out.println("finished");
}
@Override
public void run() {
// TODO Auto-generated method stub
synchronized(this) {
System.out.println("现在是对象锁形式:"+Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"已经运行结束");
}
}
}
运行结果:
现在是对象方法锁的形式:Thread-0
Thread-0已经运行结束
现在是对象方法锁的形式:Thread-1
Thread-1已经运行结束
finished
- 同步代码块
public class Demo2 implements Runnable{
static Demo2 demo2=new Demo2();
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread t1=new Thread(demo2);
Thread t2=new Thread(demo2);
t1.start();
t2.start();
while(t1.isAlive()||t2.isAlive()) {
}
System.out.println("finished");
}
@Override
public void run() {
// TODO Auto-generated method stub
synchronized(this) {
System.out.println("现在是对象锁形式:"+Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"已经运行结束");
}
}
}
运行结果:
public class Demo2 implements Runnable{
static Demo2 demo2=new Demo2();
Object object1=new Object();
Object object2=new Object();
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread t1=new Thread(demo2);
Thread t2=new Thread(demo2);
t1.start();
t2.start();
while(t1.isAlive()||t2.isAlive()) {
}
System.out.println("finished");
}
@Override
public void run() {
// TODO Auto-generated method stub
synchronized(object1) {
System.out.println("现在是object1:"+Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"object1已经运行结束");
}
synchronized(object1) {
System.out.println("现在是object2:"+Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"object2已经运行结束");
}
}
}
两个同步代码块锁定是同一个实例,运行结果;
现在是object1:Thread-0
Thread-0object1已经运行结束
现在是object1:Thread-1
Thread-1object1已经运行结束
现在是object2:Thread-1
Thread-1object2已经运行结束
现在是object2:Thread-0
Thread-0object2已经运行结束
finished
public class Demo2 implements Runnable{
static Demo2 demo2=new Demo2();
Object object1=new Object();
Object object2=new Object();
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread t1=new Thread(demo2);
Thread t2=new Thread(demo2);
t1.start();
t2.start();
while(t1.isAlive()||t2.isAlive()) {
}
System.out.println("finished");
}
@Override
public void run() {
// TODO Auto-generated method stub
synchronized(object1) {
System.out.println("现在是object1:"+Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"object1已经运行结束");
}
synchronized(object2) {
System.out.println("现在是object2:"+Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"object2已经运行结束");
}
}
}
两个同步代码块锁定是不同实例,运行结果:
现在是object1:Thread-0
Thread-0object1已经运行结束
现在是object1:Thread-1
现在是object2:Thread-0
Thread-0object2已经运行结束
Thread-1object1已经运行结束
现在是object2:Thread-1
Thread-1object2已经运行结束
finished
总结:
代码块形式:手动指定锁对象
方发锁形式:Synchronized修饰普通方法,锁对象默认为this.
2.类锁
概念
- 只有一个class对象:java类可能会有很多个对象,但只有一个类对象。
- 本质:所谓的类锁,不过是class对象的锁而已。
- 用法和效果:类锁在同一时刻只能被一个对象拥有。
两种形式
- Synchronized修饰静态的方法
public class Demo4 implements Runnable{
static Demo4 demo2=new Demo4();
static Demo4 demo3=new Demo4();
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread t1=new Thread(demo2);
Thread t2=new Thread(demo3);
t1.start();
t2.start();
while(t1.isAlive()||t2.isAlive()) {
}
System.out.println("finished");
}
@Override
public void run() {
// TODO Auto-generated method stub
method();
}
public **static** synchronized void method() {
System.out.println("现在是对象方法锁的形式:"+Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"已经运行结束");
}
}
运行结果:
现在是对象方法锁的形式:Thread-0
Thread-0已经运行结束
现在是对象方法锁的形式:Thread-1
Thread-1已经运行结束
finished
2. 指定锁为class对象
public class Demo5 implements Runnable{
static Demo5 demo2=new Demo5();
static Demo5 demo3=new Demo5();
public static void main(String[] args) {
// TODO Auto-generated method stub
Thread t1=new Thread(demo2);
Thread t2=new Thread(demo3);
t1.start();
t2.start();
while(t1.isAlive()||t2.isAlive()) {
}
System.out.println("finished");
}
@Override
public void run() {
// TODO Auto-generated method stub
method();
}
private void method() {
synchronized (Demo5.class) {
System.out.println(Thread.currentThread().getName());
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"已经运行结束");
}
}
}
运行结果:
Thread-0已经运行结束
现在是对象方法锁的形式:Thread-1
Thread-1已经运行结束
finished
- [喵咪开源软件推荐(4)]Liunx跑分神器-unixbench
- 正则化贪心森林(RGF)的入门简介,含案例研究
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 路由(二)之分库分表路由
- [喵咪开源软件推荐(3)]全球IP库-GeoLite2-City
- [喵咪MQ(3)]RabbitMQ集群安装配置
- 动态实现指定图片半透明及鼠标事件
- JVM杂谈之JIT
- 熔断器 Hystrix 源码解析 —— 执行结果缓存
- [喵咪MQ(2)]RabbitMQ单机模式使用
- [喵咪MQ(1)]RabbitMQ简单介绍准备工作
- Dubbo 源码解析 —— Directory
- [喵咪大数据]Hbase搭建和基本使用
- CSS:模拟Windows窗口及DIV居中
- [喵咪大数据]Hive2搭建和基本操作
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- shadow dom一个最简单的例子
- 程序员必读:Git提交信息和分支创建规范
- 使用brew cask安装minikube的各种错误和解决方法
- 编写高质量可维护的代码:一目了然的注释
- SAP Hybris - how to find corresponding cronjob for a given import
- Linux与Windows间文件互传之TFTP方式
- 假设检验在数据分析中的应用
- 【前端开发】文本阴影:如何使用text-shadow实现首字线索引效果?
- 9.25【前端开发】超链接伪类:如何在svg元素上使用超链接伪类?
- 竞赛比完,代码、模型怎么处理?Kaggle大神:别删,这都是宝藏
- 9.26【前端开发】背景属性:样式中背景色和背景图片样式如何使用?
- 9.27【前端开发】图片文件格式:常见的图片格式对比有何优劣以及如何使用Google的webp格式?
- 9.28【前端开发】文本属性:如何使用文本阴影等样式?
- 9.29【前端开发】超链接伪类:如何在svg元素上使用超链接伪类?
- Angular input控件的click事件表达式如何被转换成JavaScript函数