论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
数据库
›
SqlServer
›
Java线程安全之同步方法
Java线程安全之同步方法
乌市泽哥
金牌会员
|
2024-8-1 23:01:00
|
显示全部楼层
|
阅读模式
楼主
主题
679
|
帖子
679
|
积分
2037
同步方法
使用synchronized修饰的方法,就叫做同步方法,其固定格式如下:
public [static] synchronized 返回值类型 同步方法() {
可能会产生线程安全问题的代码
}
复制代码
留意事项:
同步方法可以是平凡成员方法,也可以是static静态方法
平凡成员同步方法,默认锁对象为this,即当火线法的调用对象
static静态同步方法,默认锁对象是当前类的字节码对象(一个类有且只有一个)
类的字节码对象:类名.class,固定用法(当前记取即可,后续反射章节会学习)
案例1:平凡同步方法
创建子线程1,调用100次平凡方法print1(逐字输出 “好好学习”)
创建子线程2,调用100次平凡方法print2(逐字输出 “天天向上”)
要求,两个子线程在执行方法的过程中,不会被另一个线程打断。
class Printer {
//普通同步方法: 锁对象默认为this
public synchronized void print1() {
System.out.print("天");
System.out.print("天");
System.out.print("向");
System.out.print("上");
System.out.println();
}
public void print2() {
//同步代码块,也使用this作为锁对象
//测试时,可以注释同步代码块,或使用其他锁对象,然后观察程序运行效果
//synchronized (Printer.class) {
synchronized (this) {
System.out.print("努");
System.out.print("力");
System.out.print("学");
System.out.print("习");
System.out.println();
}
}
}
public class Test16_Funtion {
public static void main(String[] args) {
//准备一个对象
final Printer p = new Printer();
//创建子线程1,输出100次 "好好学习"
Thread th1 = new Thread() {
@Override
public void run() {
for(int i = 0; i < 100; i++)
p.print1();
}
};
//创建子线程2,输出100次 "天天向上"
Thread th2 = new Thread() {
@Override
public void run() {
for(int i = 0; i < 100; i++)
p.print2();
}
};
th1.start();
th2.start();
}
}
复制代码
测试结果:
print2方法不使用同步代码块,或不使用this作为锁对象,会出现输出杂乱的情况,线程没有实现同步(上锁失败)
print2方法使用同步代码块,且用this作为锁对象,成功实现线程同步
案例2:静态同步方法
将上述案例中的平凡同步方法,修改为静态同步方法,实现原有功能。
class Printer {
// ...省略print1() print2()
//static静态同步方法: 锁对象默认为当前类字节码对象
public static synchronized void print3() {
System.out.print("天");
System.out.print("天");
System.out.print("向");
System.out.print("上");
System.out.println();
}
public void print4() {
//同步代码块,使用当前类字节码对象作为锁对象
//注释掉同步代码块,运行测试,观察效果
//不使用当前类字节码对象作为锁对象,运行测试,观察效果
//synchronized (this) {
synchronized (Printer.class) {
System.out.print("努");
System.out.print("力");
System.out.print("学");
System.out.print("习");
System.out.println();
}
}
}
public class Test16_Funtion {
public static void main(String[] args) {
//准备一个对象
final Printer p = new Printer();
//创建子线程1,输出100次 "好好学习"
Thread th1 = new Thread() {
@Override
public void run() {
for(int i = 0; i < 100; i++)
Printer.print3();
}
};
//创建子线程2,输出100次 "天天向上"
Thread th2 = new Thread() {
@Override
public void run() {
for(int i = 0; i < 100; i++)
p.print4();
}
};
th1.start();
th2.start();
}
}
复制代码
运行测试:
按照print4方法中形貌进行测试,验证结论:
static静态同步方法: 锁对象默认为当前类字节码对象(类名.class)
线程状态图为:
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
乌市泽哥
金牌会员
这个人很懒什么都没写!
楼主热帖
是什么让.NET7的Min和Max方法性能暴增 ...
活动 | 塑造软件新生态 赋能发展新变革 ...
MySQL审计插件-MariaDB Audit Plugin ...
[WPF] 使用 HandyControl 的 CirclePan ...
面试题:海量数据处理利器-布隆过滤器 ...
逍遥自在学C语言 | 关系运算符 ...
@RequestParam,@PathVariable两个注解 ...
第一个编译器
Hadoop概述
CentOS7 安装 Redis 7.0.2
标签云
挺好的
服务器
快速回复
返回顶部
返回列表