精华内容
下载资源
问答
  • synchronized :java内置关键字,被保存在对象头中,而一...这在JDK1.6之间这样说是没毛病,但是在JDK1.6及以后,还这样认为那就欠妥了,因为在JDK1.6及以后JVM层面对它作了优化,可以由轻到重分为:偏向锁->轻...

    synchronized :java内置关键字,被保存在对象头中,而一个对象则是由对象头、实例数据、对其填充三部分组成。

    很多时候大家伙都惯性地将synchronized称为一个重量级锁,理由是synchronized性能开销较重;这在JDK1.6之间这样说是没毛病的,但是在JDK1.6及以后,还这样认为那就欠妥了,因为在JDK1.6及以后JVM层面对它作了优化,可以由轻到重分为:偏向锁->轻量级锁->重量级锁;并且可自动进行锁粒度的切换升级。所以从性能开销的程度来讲,已经变得和Lock相差无几了!

    一般来说synchronized有三种用法:

    一、作用于静态方法

    给当前类加锁,又可称之静态方法锁:可以修饰在静态方法名前: public static synchronized void inc() :

    又可以修饰在静态方法里的代码块(如下): synchronized (Method.class){}

    package com.wuqx.demo;public class Method { private static int count = 0; public static void inc(){ synchronized (Method.class){ try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } count ++; } } public static void main(String[] args) { for (int i = 0; i < 100; i++) { //不要new太多的线程,避免操作系统假死,出现找不到主类的错误 new Thread(()->Method.inc()).start(); } while(Thread.activeCount()>1){ //这里也可以使用Thread.sleep()方法进行阻塞,避免得到错误的结果 Thread.yield(); } System.out.println("result:"+Method.count); }}

    总结:可以保证多个实例对象调用静态方法时保证其安全性

    二、作用于实例方法

    即对象锁,对同一个对象加锁,保证多个线程访问同一个对象时线程的安全,进入同步代码前要获得当前对象的锁,

    (1)多个线程对同一对象进行访问,代码清单如下:

    package t;public class Method implements Runnable{ private static int count = 0; public synchronized void run(){ for(int i=0; i<5; i++){ System.out.println(Thread.currentThread().getName()+":"+count++); } } public static void main(String[] args) { Method md = new Method(); Thread thread1 = new Thread(md,"thread1"); Thread thread2 = new Thread(md,"thread2");  thread1.start(); thread2.start();  int i = 0; while(Thread.activeCount()>1){ System.out.println("第"+i+++"次出让系统资源"); Thread.yield(); } System.out.println("result:"+Method.count); }}

    运行结果:

    1775e3c511549e862db4ac2282addbcd.png

    (2)多个线程对不同对象访问,则会造成线程的安全问题;因为两个对象之间没有关系,是独立的,内存地址,保存在对象头里的锁也不相同,所以会造成线程安全问题。代码清单如下(两个线程执行两个对象):

    package t;

    public class Method implements Runnable{

    private static int count = 0;

    public synchronized void run(){

    for(int i=0; i<5; i++){

    System.out.println(Thread.currentThread().getName()+":"+count++);

    }

    }

    public static void main(String[] args) {

    Method md = new Method();

    Method md1 = new Method();

    Thread thread1 = new Thread(md,"thread1");

    Thread thread2 = new Thread(md1,"thread2");

    thread1.start();

    thread2.start();

    }

    }

    ​​运行结果如下:

    02915bf6980d397230b5a3b169998669.png

    可见这种情况只能通过将run方法里的方法静态化,通过类锁去解决:代码清单如下:

    ​​package t;public class Method implements Runnable{ private static int count = 0; public void run(){ //这里加与不加synchronized 效果都一样,可以思考下为什么 inc(); } public static synchronized void inc(){ for(int i=0; i<5; i++){ System.out.println(Thread.currentThread().getName()+":"+count++); } } public static void main(String[] args) { Method md = new Method(); Method md1 = new Method(); Thread thread1 = new Thread(md,"thread1"); Thread thread2 = new Thread(md1,"thread2");  thread1.start(); thread2.start(); }}

    运行结果如下:

    a4cd6869e49e1c0d8513544001612294.png

    三、修饰代码快

    写法为synchronized(obj){},实际工程上都用写为synchronized(this){}, 这是对于多个线程访问同一对象,代码清单如下;如果多个线程访问不同对象,那么这样写还是不能保证线程的安全,因为将对象不同,锁也就不是同一把锁了,这样就同样需要类锁去实现了。

    package t;

    public class Method implements Runnable{

    private static int count = 0;

    public void run(){

    inc();

    }

    public void inc(){

    synchronized(this){

    for(int i=0; i<5; i++){

    System.out.println(Thread.currentThread().getName()+":"+count++);

    }

    }

    }

    public static void main(String[] args) {

    Method md = new Method();

    Thread thread1 = new Thread(md,"thread1");

    Thread thread2 = new Thread(md,"thread2");

    thread1.start();

    thread2.start();

    }

    }

    运行结果:

    ​​​

    4e6b52d913f883d0125fe18470fce555.png

    如果觉得对自己有帮助的话,不妨关注点赞转发支持下哦!​​

    相关导读:

    synchronized与Lock的区别

    展开全文
  • 1. try 、catch、finally用法总结 1、在进行异常处理之后,在异常处理格式中还有一个finally语句,那么此语句将作为异常统一出口,不管是否产生了异常,最终都要执行此段代码。 2、当try、catch中有return时...

    1. try 、catch、finally用法总结

        1、在进行异常的处理之后,在异常的处理格式中还有一个finally语句,那么此语句将作为异常的统一出口,不管是否产生了异常,最终都要执行此段代码。
        2、当try、catch中有return时,finally中的代码依然会继续执行
        3、finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的。
        4、finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值
    
    

    2. try+catch的处理流程

        1、 一旦产生异常,则系统会自动产生一个异常类的实例化对象。
        2、 那么,此时如果异常发生在try语句,则会自动找到匹配的catch语句执行,如果没有在try语句中,则会将异
        常抛出.
        3、 所有的catch根据方法的参数匹配异常类的实例化对象,如果匹配成功,则表示由此catch进行处理。
    

    3. 当我们操作引用数据类型的时候返回值是什么呢?

    public class Demo {
        public static void main(String[] args) {
            Person p = haha();
            System.out.println(p.age);
        }
        public static Person haha(){
            Person p = new Person();
            try {
                p.age = 18;
                return p;   //被保存起来
            }catch (Exception E){
                return null;
            }finally {
                p.age = 28;
            }
    
        }
        static class Person{
            int age;
        }
    }
    
    结果 
    ​	28
    

    总结:

    ​ return p 是把引用数据(堆中)地址保存起来(18),finally再赋值的时候,该地址内容变为28,所以返回28.

    4. 当我们操作数据类型的时候返回值是什么呢?

    public class Demo1 {
        public static void main(String[] args) {
            int a  = haha();
            System.out.println(a);
        }
        public static int haha(){
            int a = 10;
            try {
                return a;   //被保存起来
            }catch (Exception E){
                return 0;
            }finally {
                a = 20;
            }
    
        }
    }
    
    结果
    	10
    

    总结:

    ​ 基本数据类型创建的时候在栈中,当我们返回a的时候会先保存起来,后面finally再赋值的时候,a的值为20,但返回的是被保存起来的值,所以值没有变化,还是10.

    5. 如果在finally添加返回值

    public class Demo1 {
        public static void main(String[] args) {
            int a  = haha();
            System.out.println(a);
        }
        public static int haha(){
            int a = 10;
            try {
                return a;   
            }catch (Exception E){
                return 0;
            }finally {
                a = 20;
                return a;
            }
    
        }
    }
    
    结果
    	20
    

    总结:

    ​ 明显,当try或者catch中有返回值,但是finally中也有返回语句时,最终返回的是finally中的返回值.

    几个面试题:

    1. try-catch-finally 中哪个部分可以省略?
    	答: catch和finally可以省略其中一个 , catch和finally不能同时省略
    	注意:格式上允许省略catch块, 但是发生异常时就不会捕获异常了,我们在开发中也不会这样去写代码.
    2. try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?
    	答:finally中的代码会执行
    	详解:
    	执行流程:
    	(1) 先计算返回值, 并将返回值存储起来, 等待返回
    	(2) 执行finally代码块
    	(3) 将之前存储的返回值, 返回出去;
    	需注意:
    	(1) 返回值是在finally运算之前就确定了,并且缓存了,不管finally对该值做任何的改变,返回的值都不
    	会改变
    	(2) finally代码中不建议包含return,因为程序会在上述的流程中提前退出,也就是说返回的值不是try或
    	catch中的值
    	(3) 如果在try或catch中停止了JVM,则finally不会执行.例如停电- -, 或通过如下代码退出
    	JVM:System.exit(0);
    
    展开全文
  • try、catch、finally用法总结:  1、不管有没有异常,finally中代码都会执行  2、当try、catch中有return时,finally中代码依然会继续执行  3、finally是在return后面表达式运算之后执行,此时并没有...

    try、catch、finally用法总结:

      1、不管有没有异常,finally中的代码都会执行

      2、当try、catch中有return时,finally中的代码依然会继续执行

      3、finally是在return后面的表达式运算之后执行的,此时并没有返回运算之后的值,而是把值保存起来,不管finally对该值做任何的改变,返回的值都不会改变,依然返回保存起来的值。也就是说方法的返回值是在finally运算之前就确定了的。

      4、finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值

    展开全文
  • this和super的用法总结 try-catch-finally的执行顺序
    展开全文
  • try、catch、finally用法总结:  1、不管有没有异常,finally中代码都会执行  2、当try、catch中有return时,finally中代码依然会继续执行  3、finally是在return后面表达式运算之后执行,此时并没有...
  • 给大家整理了关于Python中循环语句中else的用法,包括常规的 if else 用法、if else 快捷用法、与 for 关键字一起用、与 while 关键字一起用以及与 try except 一起用的用法总结,有需要的朋友们可以参考借鉴。
  • 程序运行时,发生不被期望事件,它阻止了程序按照程序员预期正常执行,这就是异常。  异常处理机制能让程序在异常发生时,按照代码预先设定异常处理逻辑,针对性地处理异常,让程序尽最大可能恢复正常并...
  • 除非try里面执行代码发生了异常,否则这里代码不会执行 }finally { 不管什么情况都会执行,包括try catch 里面用了return ,可以理解为只要执行了try或者catch,就一定会执行 finally } ret...
  • Python中else的用法总结

    万次阅读 2017-10-24 23:31:36
    本文讨论Pythonfor…else、while…else、try..except…else等语法 Python中for、while是在循环体内没有break语句、没有return语句,或者没有异常出现时才执行else语句,try..except…else是在try中无异常产生时...
  • Glide一些用法总结

    2017-11-16 15:18:55
    Glide一些用法总结 Glide做为常用图片加载第三方框架,在项目中经常用到,关于Glide一些用法做一下记录。 一、获取加载后图片缓存地址 new Thread(new Runnable() { @Override public void run() { ...
  • Python中for、while等循环都有一个可选else分支(类似if语句和try语句那样),在循环迭代正常完成之后执行。换句话说,如果我们不是以除正常方式以外其他任意方式退出循环,那么else分支将被执行。也就是在...
  • 不管 try 语句块正常结束还是异常结束,finally 语句块是保证要执行。如果 try 语句块正常结束,那么在 try 语句块中语句都执行完之后,再执行 finally 语句块。如果 try 中有控制转移语句(return、break、...
  • 清单 1 说明 finally 语句块在 try 语句块中 return 语句之前执行。我们再来看另一个例子(清单 2)。清单 2.清单 2 执行结果为:清单 2 说明了 finally 语句块在 catch 语句块中 return 语句之前执行。从上面...
  • 这篇文章给大家整理了关于Python中循环语句中else的用法,包括常规的 if else 用法、if else 快捷用法、与 for 关键字一起用、与 while 关键字一起用以及与 try except 一起用的用法总结,有需要的朋友们可以参考...
  • JAVA语言是如何进行异常处理,关键字:throws、throw、try 、catch、finally分别代表什么意义? 在try块中可以抛出异常吗? (1)程序在运行过程中发生错误或异常情况是不可避免,如果每一个运行时错误都由程序员...
  • try,catch,finally的用法

    2017-07-27 17:31:39
    Java中try,catch,finally的用法,以前感觉还算熟悉,但看到一篇博文才有更深点的理解,总结网友博客如下。 Java异常处理的组合方式: 1.try+catch  运行流程:运行到try块中,如果有异常抛出,则转到catch块去...
  • try catch finally 用法

    2019-09-23 17:58:57
    前天去甲骨文面试出了一道java基础题:以为很...否则不会执行catch里面内容 }catch { //除非try里面执行代码发生了异常,否则这里代码不会执行 }finally { //不管什么情况都会执行,包括try catch 里面用了retur...
  • BeautifulSoup类用法总结

    2020-07-06 22:22:16
    BeautifulSoup可以用来解析Requests库爬取html代码 一、BeautifulSoup基本使用 ... try: header = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrom.

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 187
精华内容 74
关键字:

try的用法总结