一、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其他概念的更多相关文章

  1. 线程池 队列 synchronized

    线程池 BlockingQueue synchronized volatile 本章从线程池到阻塞队列BlockingQueue.从BlockingQueue到synchronized 和 volat ...

  2. 从线程池到synchronized关键字详解

    线程池 BlockingQueue synchronized volatile 前段时间看了一篇关于"一名3年工作经验的程序员应该具备的技能"文章,倍受打击.很多熟悉而又陌生的知识 ...

  3. java线程学习之synchronized关键字

    关键字synchronized的作用是实现线程间的同步.它的任务是对同步的代码加锁.一个代码块同时只能有同一个线程进行读和写操作,从而保证线程间是安全的. 线程安全的概念是:当多个线程访问某一个类(对 ...

  4. java高并发系列 - 第10天:线程安全和synchronized关键字

    这是并发系列第10篇文章. 什么是线程安全? 当多个线程去访问同一个类(对象或方法)的时候,该类都能表现出正常的行为(与自己预想的结果一致),那我们就可以所这个类是线程安全的. 看一段代码: pack ...

  5. Java线程同步(synchronized)——卖票问题

    卖票问题通常被用来举例说明线程同步问题,在Java中,采用关键字synchronized关键字来解决线程同步的问题. Java任意类型的对象都有一个标志位,该标志位具有0,1两种状态,其开始状态为1, ...

  6. Java线程锁,synchronized、wait、notify详解

    (原) JAVA多线程这一块有点绕,特别是对于锁,对锁机制理解不清的话,程序出现了问题也很难找到原因,在此记录一下线程的执行以及各种锁. 1.JAVA中,每个对象有且只有一把锁(lock),也叫监视器 ...

  7. [多线程] 线程中的synchronized关键字锁

    为什么要用锁? 在多线程中,难免会出现在多个线程中对同一个对象的实例变量或者全局静态变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实 ...

  8. Java基础-多线程-③线程同步之synchronized

    使用线程同步解决多线程安全问题 上一篇 Java基础-多线程-②多线程的安全问题 中我们说到多线程可能引发的安全问题,原因在于多个线程共享了数据,且一个线程在操作(多为写操作)数据的过程中,另一个线程 ...

  9. 线程安全之 synchronized 和 ReentrantLock

    线程安全之 synchronized 和 ReentrantLock + 面试题 前面我们介绍了很多关于多线程的内容,在多线程中有一个很重要的课题需要我们攻克,那就是线程安全问题.线程安全问题指的是在 ...

  10. Java并发编程(02):线程核心机制,基础概念扩展

    本文源码:GitHub·点这里 || GitEE·点这里 一.线程基本机制 1.概念描述 并发编程的特点是:可以将程序划分为多个分离且独立运行的任务,通过线程来驱动这些独立的任务执行,从而提升整体的效 ...

随机推荐

  1. MySQL经典练习题

    表名和字段 –1.学生表 Student(s_id,s_name,s_birth,s_sex) –学生编号,学生姓名, 出生年月,学生性别 –2.课程表 Course(c_id,c_name,t_id ...

  2. EF多字段求和(分组/不分组)

    分组多字段求和 query.GroupBy(q => new { q.Year, q.Month }) .Select(q => new { Year = q.Key.Year, Mont ...

  3. 【python深入】获取对象类型及属性

    在python中,查看当前的对象所能够调用的所有方法? 查看类型可以通过type,也可以通过isinstance方法,查看属性可以通过dir() 下面是对type的介绍: ————>基本类型的判 ...

  4. 18. pt-pmp

    pt-pmp 是一个非常简单的工具,可以用来获取MySQL的堆栈信息.工具首先获取运行过程中的mysqld堆栈信息,然后将相似的线程进行汇总排序,根据调用频繁程度从高到低打印出来. 查看pt-pmp的 ...

  5. Java第四次实验

    实验一: Android Stuidio的安装测试: 参考<Java和Android开发学习指南(第二版)(EPUBIT,Java for Android 2nd)>第二十四章: 参考ht ...

  6. 主机性能监控之wmi 获取系统信息及内存性能信息

    标 题: 主机性能监控之wmi 获取系统信息及内存性能信息作 者: itdef链 接: http://www.cnblogs.com/itdef/p/3990240.html 欢迎转帖 请保持文本完整 ...

  7. 分布式协议学习笔记(一) Raft 选举

    Raft官网 官方可视化动画1 官方可视化动画2 论文中文翻译 论文英文地址 感觉作为paxos的升级精简版 Raft在设计之初就以容易理解为目标 看完资料 脑海里都有了大概的轮廓. 有了这些详细的资 ...

  8. 20175316 盛茂淞 实验一 Java开发环境的熟悉

    20175316 盛茂淞 实验一 Java开发环境的熟悉 实验目的 使用JDK编译.运行简单的Java程序 实验要求 1.建立"自己学号exp1"的目录 2.在"自己学号 ...

  9. 手动上传图片到nginx下可访问,程序上传后访问图片报403

    1. 首先查看文件权限 2. 初步确定是服务器权限问题 2.1 解决方案一:更改文件权限 2.2 解决方案二:修改nginx运行用户 1. 首先查看文件权限 #指令如下 ls -l 2. 初步确定是服 ...

  10. 小程序快捷键(mac中)

    快捷键 格式调整  - Ctrl+S:保存文件  - Ctrl+[, Ctrl+]:代码行缩进  - Ctrl+Shift+[, Ctrl+Shift+]:折叠打开代码块  - Ctrl+C Ctrl ...