码迷,mamicode.com
首页 > 其他好文 > 详细

synchronized 方法对 非synchronized方法的影响

时间:2017-10-09 22:45:21      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:inter   代码   安全   str   code   main   测试   strong   uil   

StringBuilder是线程不安全的类。

StringBuffer是线程安全的,因为它里面的方法加了synchronized。

今天写了一段代码测试了一下:用循环开启10个线程,调用StringBuffer(StringBuilder)的append追加1 到 10 。

结果预期一样:线程不安全的StringBuilder会漏掉一些数字,

public static void main(String[] args) throws InterruptedException {
        StringBuffer buffer = new StringBuffer();
        StringBuilder builder = new StringBuilder();
        // 开启十个线程,分别对buffer 和 builder 操作        
        for(int i = 0; i < 10; i++) {
            int j = i;
            new Thread(new Runnable() {
                public void run() {
                    try {
                        Thread.sleep(500); //造成阻塞
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    builder.append(j);
                }
            }).start();
        }
        //等待以上操作完成
        Thread.sleep(1000);
        // 打印结果
        System.out.println("builder:"+builder);
    }

技术分享

线程安全的StringBuffer则追加了全部10个数字:

public static void main(String[] args) throws InterruptedException {
    StringBuffer buffer = new StringBuffer();
    StringBuilder builder = new StringBuilder();
    // 开启十个线程,分别对buffer 和 builder 操作        
    for(int i = 0; i < 10; i++) {
        int j = i;
        new Thread(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(500); //造成阻塞
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                buffer.append(j);
            }
        }).start();
    }
    //等待以上操作完成
    Thread.sleep(1000);
    // 打印结果
    System.out.println("buffer:"+buffer);
}

技术分享

 

这时:如果我同时操作builder和buffer,且先调用buffer的append,这时每次操作因为builder和buffer在同一个线程,builder的方法因为buffer阻塞了线程而被变成“同步”的方法,同样append了10个数字

public static void main(String[] args) throws InterruptedException {
    StringBuffer buffer = new StringBuffer();
    StringBuilder builder = new StringBuilder();
    // 开启十个线程,分别对buffer 和 builder 操作        
    for(int i = 0; i < 10; i++) {
        int j = i;
        new Thread(new Runnable() {
            public void run() {
                try {
                    Thread.sleep(500); //造成阻塞
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                buffer.append(j);
                builder.append(j);
            }
        }).start();
    }
    //等待以上操作完成
    Thread.sleep(1000);
    // 打印结果
    System.out.println("buffer:"+buffer);
    System.out.println("builder:"+builder);
}

技术分享

 

synchronized 方法对 非synchronized方法的影响

标签:inter   代码   安全   str   code   main   测试   strong   uil   

原文地址:http://www.cnblogs.com/whatsoever/p/7643045.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!