线程同步机制是一套用于协调线程之间的数据访问的机制.该机制可以保障线程安全。
Java平台提供的线程同步机制包括: 锁, volatile关键字, final关键字,static关键字,以及相关的API,如Object.wait()/Object.notify()等。
每一个服务进程的运行,都包含若干进程(Thread),线程是调度的基本单位,进程则是资源拥有的基本单位。
线程有自己的私有数据,比如栈和寄存器,同时与其它线程共享相同的虚拟内存和全局变量等资源,当多个线程同时读写同一份共享资源的时候,会引起冲突,这时候就需要引入线程同步机制使各个线程排队一个一个的对共享资源进行操作,而不是同时进行。
![](http://tiebapic.baidu.com/forum/w%3D580/sign=f3ca44159cd4b31cf03c94b3b7d7276f/8e20d8300a55b31952e3dd2354a98226cefc17b6.jpg?tbpicau=2024-09-18-05_e794ec9892e5fabfc3e84085f6ab1fbe)
1、线程同步其实实现的是线程排队。
2、防止线程同步访问共享资源造成冲突。
3、变量需要同步,常量不需要(常量存放于方法区)。
4、多个线程访问共享资源的代码有可能是同一份代码,也有可能是不同的代码;无论是否执行同一份代码,只要这些线程的代码访问同一份可变的共享资源,这些线程之间就需要同步。
线程同步好处:
多个线程同时访问共享数据时,防止数据被损坏。
线程同步带来的问题:
1、实现比较繁琐,而且容易出错。
必须对多个线程可能同时访问的所有数据,用额外的代码包围起来,以获得和释放一个同步锁。这需要由程序员来保证没有遗漏,对多线程共享的数据的加锁工作。并且,在程序完成时,需要进行压力测试以保证多个线程并发时,结果如预期。
2、它会损害性能。
获取和释放一个锁是需要时间的。因为需要额外的调用一些方法,并且需要协调调度下一个获得锁的线程。
3、每次只能允许一个线程访问资源。这是锁的全部意义所在,但也是问题所在,因为阻塞一个线程可能会造成更多的线程被创建。
线程同步建议:
1、线程同步并不是一件好事,设计自己的应用程序是应酌情考虑,尽量避免线程同步。
2、避免使用一些共享数据,如静态字段。(如果有多线程同时读写这个静态字段就有问题)
3、试着用值类型,因为值类型总是会被复制,每个线程操作的都是自己的那个副本。
4、多线程对共享数据进行只读访问是没有任何问题的。
注:本文摘自动力节点官网:http://www.bjpowernode.com/javathread/1199.html?seo
Java平台提供的线程同步机制包括: 锁, volatile关键字, final关键字,static关键字,以及相关的API,如Object.wait()/Object.notify()等。
每一个服务进程的运行,都包含若干进程(Thread),线程是调度的基本单位,进程则是资源拥有的基本单位。
线程有自己的私有数据,比如栈和寄存器,同时与其它线程共享相同的虚拟内存和全局变量等资源,当多个线程同时读写同一份共享资源的时候,会引起冲突,这时候就需要引入线程同步机制使各个线程排队一个一个的对共享资源进行操作,而不是同时进行。
![](http://tiebapic.baidu.com/forum/w%3D580/sign=f3ca44159cd4b31cf03c94b3b7d7276f/8e20d8300a55b31952e3dd2354a98226cefc17b6.jpg?tbpicau=2024-09-18-05_e794ec9892e5fabfc3e84085f6ab1fbe)
1、线程同步其实实现的是线程排队。
2、防止线程同步访问共享资源造成冲突。
3、变量需要同步,常量不需要(常量存放于方法区)。
4、多个线程访问共享资源的代码有可能是同一份代码,也有可能是不同的代码;无论是否执行同一份代码,只要这些线程的代码访问同一份可变的共享资源,这些线程之间就需要同步。
线程同步好处:
多个线程同时访问共享数据时,防止数据被损坏。
线程同步带来的问题:
1、实现比较繁琐,而且容易出错。
必须对多个线程可能同时访问的所有数据,用额外的代码包围起来,以获得和释放一个同步锁。这需要由程序员来保证没有遗漏,对多线程共享的数据的加锁工作。并且,在程序完成时,需要进行压力测试以保证多个线程并发时,结果如预期。
2、它会损害性能。
获取和释放一个锁是需要时间的。因为需要额外的调用一些方法,并且需要协调调度下一个获得锁的线程。
3、每次只能允许一个线程访问资源。这是锁的全部意义所在,但也是问题所在,因为阻塞一个线程可能会造成更多的线程被创建。
线程同步建议:
1、线程同步并不是一件好事,设计自己的应用程序是应酌情考虑,尽量避免线程同步。
2、避免使用一些共享数据,如静态字段。(如果有多线程同时读写这个静态字段就有问题)
3、试着用值类型,因为值类型总是会被复制,每个线程操作的都是自己的那个副本。
4、多线程对共享数据进行只读访问是没有任何问题的。
注:本文摘自动力节点官网:http://www.bjpowernode.com/javathread/1199.html?seo