码迷,mamicode.com
首页 > 编程语言 > 详细

多线程之synchronized讲解

时间:2017-08-14 10:10:35      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:有序性   dex   工作   链接   之间   syn   style   .com   sleep   

参考链接:http://www.cnblogs.com/paddix/p/5374810.html

针对上述的问题:多线程一个5个特性:

1.共享性 2.互斥性 3.原子性 4.可见性 5.有序性

使用synchronized可以解决:1.确保线程互斥的访问同步代码 2.保证代码及时的可见3.有效解决重排问题。

首先看存在线程安全问题的代码:

public class SynchronizedTest {

    public static void main(String[] args){
        OutPut out = new OutPut();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                out.output("aobama");
            }
        }).start();
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                out.output("luosifu");
            }
        }).start();
    }
}

输出结果:

l u a o b a m o s i a f u 

显然不对。我们尝试用synchronized来解决上述问题:

1.修饰方法(将共同调用的方法锁住):

public class OutPut {
    public synchronized void output(String name){
        for(int i =0;i < name.length();i++){
            System.out.print(name.charAt(i)+" ");
        }
    }
}

输出结果是:

a o b a m a l u o s i f u 

2.使用synchronized将需要互斥的代码包含起来,并上一把锁(注意:synchronized锁住的必须是多线程之间共有的)

public class OutPut {
    public void output(String name){
        synchronized (this){
            for(int i =0;i < name.length();i++){
                System.out.print(name.charAt(i)+" ");
            }
        }
    }
}

输出结果:

a o b a m a l u o s i f u 

Synchronized详解:

一个线程执行互斥代码过程如下:
1.获得同步锁
2.清空工作内存
3.从主内存中拷贝对象副本到工作内存中
4.执行代码
5.刷新主内存数据
6.释放同步锁      
所以,synchronized既保证了多线程之间的并发有序性,也保证了多线程的可见性。   这也是使用synchronzied能保证数据安全的原因。

 

多线程之synchronized讲解

标签:有序性   dex   工作   链接   之间   syn   style   .com   sleep   

原文地址:http://www.cnblogs.com/lfdingye/p/7355641.html

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