一、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. 图片转base64上传,视频同理。

    body: <input type="file" id="img" type="file" onchange="up()&q ...

  2. IBGP规划

    在IBGP邻居中,使用反射器减少IBGP邻居关系是一种最常用的网络结构,在上图中AS65001中有6台路由器,其中,R1和R2是一组反射器,配置如下: R1: ! interface Loopback ...

  3. 791. Custom Sort String字符串保持字母一样,位置可以变

    [抄题]: S and T are strings composed of lowercase letters. In S, no letter occurs more than once. S wa ...

  4. MYSQL(Mariadb)

    CentOS7下安装MariaDB 添加 MariaDB yum 仓库(官网的,也可以直接用aliyun云的) vi /etc/yum.repos.d/MariaDB.repo [mariadb] n ...

  5. Linux的top命令

    文章来自于长风破浪博主的内容,下面是该博客网址. https://www.cnblogs.com/dragonsuc/p/5512797.html 为了自己能多学习,多记忆,所以直接搬到了这里,希望小 ...

  6. Solr定时导入功能实现

    需要实现Solr定时导入功能的话,我们可以通过使用Solr自身所集成的dataimportscheduler调度器实现 下载对应的jar包,下载地址https://code.google.com/ar ...

  7. [SoapUI] 从测试套件,测试用例,测试步骤,测试数据各个级别控制是否执行

    自动保存 # -*- coding: utf-8 -*- import java.awt.Color import org.apache.poi.ss.usermodel.Cell import or ...

  8. asp.net core2.0中网站发布的时候,怎么样才配置才可以使视图文件不被打包进去?

    默认设置可真是坑~~ https://q.cnblogs.com/q/99680/

  9. selenium+java+chrome 自动化测试环境搭建

    安装jdk    (jdk 配置环境变量)    eclipse(可用免安装的) 安装谷歌浏览器 下载chorme driver (chorme driver 也要配置环境变量,将chormedriv ...

  10. 【轻松前端之旅】​CSS选择器中的空格与尖括号有何区别?

    CSS选择器中的空格与尖括号有何区别? 例子1: .a .b { margin: 0; } 空格隔开a和b,选择所有后代元素. 例子2: .a>.b { margin: 0; } 尖括号隔开a和 ...