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 ...
随机推荐
- Redis、mongdb、memcached的个人总结
有测试的实例:http://colbybobo.iteye.com/blog/1986786 详细描述优缺点:https://www.cnblogs.com/binyue/p/4582550.html
- Longest Palindromic Substring (最长回文字符串)——两种方法还没看,仍需认真看看
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- ibatis中的符号#跟$区别
昨天一个项目中在写ibatis中的sql语句时,order by #field#, 运行时总是报错,后来上网查了查,才知道这里不该用#,而应该用$,随即查了下#与$的区别. 总结如下: 1.#是把 ...
- AC日记——Sagheer, the Hausmeister codeforces 812b
812B - Sagheer, the Hausmeister 思路: 搜索: 代码: #include <cstdio> #include <cstring> #includ ...
- Template Mode 'HTML5' is deprecated与UnsatisfiedDependencyException
org.thymeleaf.templatemode.TemplateMode : [THYMELEAF][main] Template Mode 'HTML5' is deprecated. Usi ...
- 【剑指offer】面试题 4. 二维数组中的查找
面试题 4. 二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序. 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该 ...
- react native android 应用状态(前端或后台)的判断
当Android应用程序被暂时放到了后台,或者又重新回到前台,是否有相应的事件可以处理到? 例如,当你的应用暂时放到了后台,是否应该做出一些操作,暂时保存界面上的数据? 可以参考:https://gi ...
- 【ASP.NET MVC】 路由机制:命名路由
首先看一下命名路由和没有命名的差别: 命名路由: routes.MapRoute( name: "Test", // Route name url: "code/p/{a ...
- php在web服务器中的工作原理
1.web工作原理 我是学习PHP网站建设的,那么网站在客户端和服务端的运行是网站运行的根本所在,那个这个运行过程是怎样的呢?我们一探就将! Web:终端 服务器web:我们把提供(响应)服务的计算机 ...
- 洛谷——P3414 SAC#1 - 组合数
P3414 SAC#1 - 组合数 题目背景 本题由世界上最蒟蒻最辣鸡最撒比的SOL提供. 寂月城网站是完美信息教室的官网.地址:http://191.101.11.174/mgzd . 题目描述 辣 ...