架构师之路--线程基础--多个线程多把锁
来源:互联网 发布:知念和凉介抱在一起睡 编辑:程序博客网 时间:2024/06/15 21:49
多个线程的情况下,每个线程拿到自己的锁后,执行自己的代码段,线程之间互不干扰,下面看看会照成什么样的影响。
代码如下:
分别创建三个线程,给方法加上synchronized关键字,也就是加上一把锁。
package action;
public class Thread02 {
private int num = 0;
public synchronized void getNum(String tag){
if(tag.equals("a")){
System.out.println("tag a,set num over");
}else if(tag.equals("b")){
System.out.println("tag b,set num over");
}else if(tag.equals("c")){
System.out.println("tag c,set num over");
}
System.out.println("tag:"+tag+" num="+num);
}
public static void main(String[] args) {
final Thread02 thread01 = new Thread02();
final Thread02 thread02 = new Thread02();
final Thread02 thread03 = new Thread02();
Thread t1=new Thread(new Runnable() {
@Override
public void run() {
thread01.getNum("a");
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
thread02.getNum("b");
}
});
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
thread03.getNum("c");
}
});
t1.start();
t2.start();
t3.start();
}
}
结果出乎意料,程序并没有按照预定的顺序执行,运行结果如下:
tag a,set num over
tag b,set num over
tag:b num=0
tag:a num=0
tag c,set num over
tag:c num=0
为什么会照成这种输出结果,因为每个想成都获得一把独立的锁,线程之间互不干扰。
为了让代码按顺序执行,我们在将方法变为静态的static,如下:
private static int num = 0;
public static synchronized void getNum(String tag){
if(tag.equals("a")){
System.out.println("tag a,set num over");
}else if(tag.equals("b")){
System.out.println("tag b,set num over");
}else if(tag.equals("c")){
System.out.println("tag c,set num over");
}
System.out.println("tag:"+tag+" num="+num);
}
运行结果正常
tag a,set num over
tag:a num=0
tag b,set num over
tag:b num=0
tag c,set num over
tag:c num=0
这是为什么呢?加上static表示类级别的锁,独占class文件,在一个线程没有执行完之前,其他县城是不被允许进入代码的。
- 架构师之路--线程基础--多个线程多把锁
- 多个线程多把锁
- 多线程基础学习第二篇(多个线程多把锁)
- 架构师之路--线程
- 线程-多个线程多个锁
- 线程基础学习第一篇(多个线程竞争一把锁)
- 架构师养成记--1线程基础
- 多个线程多个锁
- lua 多个线程
- 线程基础之产生线程
- 架构师之路--多线程之守护线程
- 多个线程调用同一个线程函数
- Java基础——多个线程共享数据
- 用一个线程模拟多个线程,减少线程数量~
- 用一个线程模拟多个线程,减少线程数量~
- java基础--线程04--多个线程访问共享对象和数据的方式
- JAVA基础学习--一个线程加一运算,一个线程做减一运算,多个线程同时交替运行--synchronized
- 线程2:线程通信事件机制(单线程、两个线程、多个线程通信)
- ueditor--JSP使用
- nyoj1276机器设备(河南省第九届ACM省赛)
- 产品经理OR售前支持
- Java虚拟机JVM性能优化(二):编译器
- 构造器(构造方法)问题
- 架构师之路--线程基础--多个线程多把锁
- JUnit学习笔记(4)パラメータ化テスト
- NSMenuItem 设置不可点击
- spring boot下JedisCluster客户端的配置,连接Redis集群
- 利用闲置硬盘建立简单的家用NAS--之lvm2:多硬盘合并
- 微信开通筛选工具
- iOS合并lib(.a)库
- 使用pydicom读取dicom文件,并对文件做一些简单操作
- java中一些常用类