synchronized 线程同步-类级别锁定
1.demo
说明:代码中通过 printNum 方法传入参数判断 a、b 分别对 num 这个参数的值进行了修改。
package demo1;
import sun.applet.Main;
public class MyThread2 extends Thread {
private int num = 0;
public synchronized void printNum(String str) {
try {
if (str.equals("a")) {
num = 1000;
System.err.println("thread -> A over");
Thread.sleep(1000);
} else if (str.equals("b")) {
num = 200;
System.err.println("thread -> B over");
}
System.err.println("str:" + str + "\tnum:" + num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
//2个不同的对象,只能new一次
final MyThread2 n1 = new MyThread2();
final MyThread2 n2 = new MyThread2();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
n1.printNum("a");
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
n2.printNum("b");
}
});
t1.start();
t2.start();
}
}
结果输出:
thread -> A over
thread -> B over
a休眠2秒后
str:b num:200
str:a num:1000
描述:
synchronized 结果中并没有发生作用,正常的结果应该是:先执行完a,在执行b。
Thread.sleep(1000): 让当前线程挂起、停顿,交出当前线程占用cpu的时间(在某个时间内,把资源给别人,当前线程在这个时间不占用),使其他线程与当前的线程抢占cpu资源,让2个线程重新分配资源,让另一个线程抢到资源并执行。
2.demo
package demo1; import sun.applet.Main;
public class MyThread2 extends Thread { private static int num = 0;
public static synchronized void printNum(String str) { try {
if (str.equals("a")) {
num = 1000;
System.err.println("thread -> A over");
Thread.sleep(1000);
} else if (str.equals("b")) {
num = 200;
System.err.println("thread -> B over");
}
System.err.println("str:" + str + "\tnum:" + num);
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static void main(String[] args) {
//2个不同的对象,只能new一次
final MyThread2 n1 = new MyThread2();
final MyThread2 n2 = new MyThread2();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
n1.printNum("a");
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
n2.printNum("b");
}
});
t1.start();
t2.start();
}
}
结果输出:
thread -> A over
str:a num:1000
thread -> B over
str:b num:200
描述:多个线程多个锁,每个线程都会去拿到属于自己的锁,分别获得后,执行 synchronized 修饰的方法。
1.synchronized 取得的锁都是对象锁,而不是把一段代码、方法的锁,多个线程就持有该所属的对象锁。2个对象,线程获取的就是2个不同的锁(相互午影响)。
2.有一种情况就是【相同的锁】,就是在该方法 synchronized 使用static 关键字,表示锁定class类,类级别的锁(独占class类)。
synchronized 线程同步-类级别锁定的更多相关文章
- java synchronized 线程同步机制详解
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchronized(this ...
- java多线程之synchronized(线程同步)
一.线程同步,主要应用synchronized关键字: public class TraditionalThreadSynchorinzed { public static void main(Str ...
- Java线程同步类容器和并发容器(四)
同步类容器都是线程安全的,在某些场景下,需要枷锁保护符合操作,最经典ConcurrentModifiicationException,原因是当容器迭代的过程中,被并发的修改了内容. for (Iter ...
- Java synchronized 线程同步
同步方法 class MyTheard4 implements Runnable{ private int ticket; public MyTheard4(int ticket) { this.ti ...
- synchronized 线程同步
synchronized 通常用来形容一次方法的调用,调用一旦开始,调用者必须等到方法调用返回后,才能继续执行后续的操作. 1.demo package demo1; public class My ...
- 对象级别锁 vs 类级别锁(Java)
前言 对于多线程(并发)和Spring Boot这两块在同步进行学习中,在看到使用synchronized关键字使操作同步时,看到和C#中不一样的东西,所以这里呢,就深入学习了下,若有错误之处,还望指 ...
- Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) JAVA日志的前世今生 .NET MVC采用SignalR更新在线用户数 C#多线程编程系列(五)- 使用任务并行库 C#多线程编程系列(三)- 线程同步 C#多线程编程系列(二)- 线程基础 C#多线程编程系列(一)- 简介
Python GUI之tkinter窗口视窗教程大集合(看这篇就够了) 一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读,当然也可以用博客页面最右侧的文章目录导航栏进行跳转查阅. 一.前言 ...
- iOS多线程编程:线程同步总结
1:原子操作 - OSAtomic系列函数 iOS平台下的原子操作函数都以OSAtomic开头,使用时需要包含头文件<libkern/OSBase.h>.不同线程如果通过原子操作函数对同一 ...
- C#多线程编程系列(三)- 线程同步
目录 1.1 简介 1.2 执行基本原子操作 1.3 使用Mutex类 1.4 使用SemaphoreSlim类 1.5 使用AutoResetEvent类 1.6 使用ManualResetEven ...
随机推荐
- Jmeter性能测试示例
这次成功做了一个jmeter借口性能测试的简单测试示例,分享一下给大家. jmeter作为一个简单的开源工具,基于java的性能测试工具,使用起来很简单. 也可以作为二次开发,复杂的情形可以自己写代码 ...
- java之基本数据类型与引用数据类型
基本数据类型 需要注意的是字符是基本数据类型,但是字符串不是基本数据类型. 引用数据类型 类.接口类型.数组类型.枚举类型.注解类型. (上面说的字符串String属于引用数据类型中“类”的范畴) 两 ...
- 7:django 中间件
中间件 中间件是一个连接django请求/相应处理的框架,是一个轻量级的低层次的全局影响django输入输出的系统插件. 每一个中间件组件负责一些特定的功能,这里我们我们只看一下如何激活使用系统自带的 ...
- UVALive 5099
B - Nubulsa Expo Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit S ...
- Bootstrap框架的简介
一.Bootstrap介绍 Bootstrap是Twitter开源的基于HTML.CSS.JavaScript的前端框架. 它是为实现快速开发Web应用程序而设计的一套前端工具包. 它支持响应式布局, ...
- 云联云通讯报错:应用与模板id不匹配,解决方法
<statusMsg>应用与模板id不匹配</statusMsg> 这种一般是后端服务器上配置的APP ID和模板ID所属的APP不一致造成的 找到发送模板短信的方法,修改ap ...
- Thinking in java基础之集合框架(转载)
集合简介(容器)把具有相同性质的一类东西,汇聚成一个整体,就可以称为集合,例如这里有20个苹果,我们把每一个苹果当成一个东西(一个对象),然后我们借用袋子把这20个苹果装起来,而这个袋子就是集合(也叫 ...
- Go语言建立一个最简单的服务端点
handlers/handlers.go package handlers import ( "encoding/json" "net/http" ) func ...
- DotNetCore 微服务上传附件
后台接口升级成netcore 2.0了,然后之前的上传图片的接口就不再使用了.新的接口形式 #region IFormCollection /// <summary> /// IFormC ...
- OpenStack 认证服务 KeyStone部署 (四)
Keystone作用: 用户与认证:用户权限与用户行为跟踪: 服务目录:提供一个服务目录,包括所有服务项和相关Api的断点 SOA相关知识 Keystone主要两大功能用户认证和服务目录(相当于一个注 ...