线程安全-005-synchronized其他概念
一、Synchornized锁重入

例子程序:
package com.lhy.thread01;
public class SyncDouble1 {
public synchronized void method1(){
System.err.println("method-1....");
method2();
}
public synchronized void method2(){
System.err.println("method-2....");
method3();
}
public synchronized void method3(){
System.err.println("method-3....");
}
public static void main(String[] args) {
final SyncDouble1 sd = new SyncDouble1();
Thread t1 = new Thread(new Runnable(){
@Override
public void run() {
sd.method1();
}
});
t1.start();
}
}

二、父子类
有父类、子类继承关系的,父类和子类都加上synchronized关键字,也是线程安全的,可以放心去用。
例子程序:
package com.lhy.thread02;
public class SyncDouble2 {
static class Main{
public int i=10;
public synchronized void operationSup(){
try {
i--;
System.err.println("Main print i ="+i);
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
static class Sub extends Main{
public synchronized void operationSub(){
try {
while(i > 0){
i--;
System.err.println("Sub print i = "+i);
Thread.sleep(100);
this.operationSup();//调用父类的方法
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
Sub sub = new Sub();
sub.operationSub();
}
});
t1.start();
}
}
打印结果;

三、出现异常,锁自动释放
例子程序:
package com.lhy.thread02; /**
* 模拟synchronized加锁的方法,发生异常时,怎么处理
* @author dev
*
*/
public class SyncException { private int i = 0;
boolean flag = true; //传过来多个任务,taskSize模拟任务个数
public synchronized void operation(int taskSize){ while(flag){
try {
i++;
Thread.sleep(200);
System.err.println(Thread.currentThread().getName()+" ,i =" +i);
if(i == (taskSize/2)){//模拟任务执行了一半
Integer.parseInt("a"); //发生异常
//throw new RuntimeException();
}
//任务执行完了停止
if(i == taskSize){
shutdown();
}
} catch (Exception e) { //catch到InterruptedException,不再往下执行
e.printStackTrace();
//情况一:所有任务不是一个整体,一个有问题不影响其他,只把出错的记录日志,下次执行,此时catch应该捕捉Exception。/continue;
System.err.println("这里可以记录到日志,i= "+i);
//情况二:所有任务是一个整体,一个有问题影响其他,此时可以通过捕捉InterruptedException、catch里抛出RuntimeException();来终止线程继续执行
//throw new RuntimeException();
//continue;
}
}
}
//终止
public void shutdown(){
this.flag = false;
} public static void main(String[] args) {
final SyncException se = new SyncException();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
se.operation(10);
}
},"t1");
t1.start(); }
}
打印结果;

如果整个任务是一个整体,1,可以 catch InterruptedException

运行结果:

2,中断线程的执行,也可以在catch里抛出运行时异常:

执行结果:


线程安全-005-synchronized其他概念的更多相关文章
- 线程池 队列 synchronized
线程池 BlockingQueue synchronized volatile 本章从线程池到阻塞队列BlockingQueue.从BlockingQueue到synchronized 和 volat ...
- 从线程池到synchronized关键字详解
线程池 BlockingQueue synchronized volatile 前段时间看了一篇关于"一名3年工作经验的程序员应该具备的技能"文章,倍受打击.很多熟悉而又陌生的知识 ...
- java线程学习之synchronized关键字
关键字synchronized的作用是实现线程间的同步.它的任务是对同步的代码加锁.一个代码块同时只能有同一个线程进行读和写操作,从而保证线程间是安全的. 线程安全的概念是:当多个线程访问某一个类(对 ...
- java高并发系列 - 第10天:线程安全和synchronized关键字
这是并发系列第10篇文章. 什么是线程安全? 当多个线程去访问同一个类(对象或方法)的时候,该类都能表现出正常的行为(与自己预想的结果一致),那我们就可以所这个类是线程安全的. 看一段代码: pack ...
- Java线程同步(synchronized)——卖票问题
卖票问题通常被用来举例说明线程同步问题,在Java中,采用关键字synchronized关键字来解决线程同步的问题. Java任意类型的对象都有一个标志位,该标志位具有0,1两种状态,其开始状态为1, ...
- Java线程锁,synchronized、wait、notify详解
(原) JAVA多线程这一块有点绕,特别是对于锁,对锁机制理解不清的话,程序出现了问题也很难找到原因,在此记录一下线程的执行以及各种锁. 1.JAVA中,每个对象有且只有一把锁(lock),也叫监视器 ...
- [多线程] 线程中的synchronized关键字锁
为什么要用锁? 在多线程中,难免会出现在多个线程中对同一个对象的实例变量或者全局静态变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实 ...
- Java基础-多线程-③线程同步之synchronized
使用线程同步解决多线程安全问题 上一篇 Java基础-多线程-②多线程的安全问题 中我们说到多线程可能引发的安全问题,原因在于多个线程共享了数据,且一个线程在操作(多为写操作)数据的过程中,另一个线程 ...
- 线程安全之 synchronized 和 ReentrantLock
线程安全之 synchronized 和 ReentrantLock + 面试题 前面我们介绍了很多关于多线程的内容,在多线程中有一个很重要的课题需要我们攻克,那就是线程安全问题.线程安全问题指的是在 ...
- Java并发编程(02):线程核心机制,基础概念扩展
本文源码:GitHub·点这里 || GitEE·点这里 一.线程基本机制 1.概念描述 并发编程的特点是:可以将程序划分为多个分离且独立运行的任务,通过线程来驱动这些独立的任务执行,从而提升整体的效 ...
随机推荐
- TPL DataFlow初探(二)
上一篇简单的介绍了TDF提供的一些Block,通过对这些Block配置和组合,可以满足很多的数据处理的场景.这一篇将继续介绍与这些Block配置的相关类,和挖掘一些高级功能. 在一些Block的构造函 ...
- Dubbo helloword
首先,开始编写服务提供者的api接口, SampleService 接口 package bhz.dubbo.sample.provider; import java.util.List; publ ...
- Python面向对象中的classmethod类方法和__getattr__方法介绍
一.classmethod介绍 介绍:@classmethod修饰符我们从名称就可以知道,这是一个类方法,那么和普通的类中的方法有什么不同的 a.类方法,是由类本身调用的,无需实例化类,直接用类本身调 ...
- 设计原则之依赖倒置js
依赖倒置 定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象:抽象不应该依赖细节:细节应该依赖抽象.(百科全书) 这个定义什么意思,太专业 感觉不像人话.. 什么叫高层模块,什么叫底层模块,什么叫 ...
- java重写equals方法需要注意的几点
为什么equals()方法要重写? 判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象.这样我们往往 ...
- python 常用标准库
标准库和第三方库第一手资料: 在线: 官方文档(https://docs.python.org/) 离线:交互式解释器(dir().help()函数),IPython(tab键提示.?.??) 一. ...
- CentOS 6.x下wget 下载提示 Unable to locally verify the issuer’s authority 完美解决方案
CentOS 6.x下wget 下载提示 Unable to locally verify the issuer’s authority 完美解决方案 栏目:Linux 作者:小天 点击: 1,453 ...
- Spring 框架下 事务的配置(复杂)
//db.properties配置 src下的文件 jdbc.jdbcUrl=jdbc:mysql:///day43jdbc.driverClass=com.mysql.jdbc.Driverjdb ...
- eclipse配置servlet错误
可能是因为你的web.xml里的<url>映射的名字和servlet相同
- CentOS7 启动中文输入法
CentOS 系统中是带有中文输入法的(智能拼音),启动方式如下: Applications --> System Tools --> Setting --> Region &am ...