Java之synchronized深入应用
参考资料
1 java synchronized详解
http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html
2 Java线程:并发协作-生产者消费者模型
http://lavasoft.blog.51cto.com/62575/221932
这篇文章说得相当不错呀,推荐呀
java关键字: synchronized,它包括两种用法:synchronized 方法和 synchronized 块.
它用来修饰一个方法或者一个代码块时,保证在同一时刻最多只有一个线程执行该段代码,
一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。
二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。
三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。
四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。
五、以上规则对其它对象锁同样适用.
synchronized 方法的缺陷:若将一个大的方法声明为synchronized 将会大大影响效率,推荐使用,synchronized 块
synchronized 块:通过 synchronized关键字来声明synchronized 块。语法如下:
package net.liuzd.thread.synchronizeds;public class ThreadSynchronized5 {public static void main(String[] args) {new ThreadSynchronized5().init();}private void init() {final OutPut op = new OutPut();new Thread(new Runnable() {@Overridepublic void run() {while (true) {try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}op.output("abcdefghi");//op.output2("abcdefghi");//用output2与output3不能进行互斥效果}}}).start();new Thread(new Runnable() {@Overridepublic void run() {while (true) {try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}op.output3("123456789"); }}}).start();}static class OutPut {public void output(String name) {//用OutPut.class与output3可以进行互斥效果//用this与output2可以进行互斥效果synchronized(OutPut.class){for (char c : name.toCharArray()) {System.out.print(c);}System.out.println();}}public synchronized void output2(String name) {for (char c : name.toCharArray()) {System.out.print(c);}System.out.println(); }public static synchronized void output3(String name) {for (char c : name.toCharArray()) {System.out.print(c);}System.out.println();}}}synchronized总结如下:
一 无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁——而且同步方法很可能还会被其他线程的对象访问。
二.每个对象只有一个锁(lock)与之相关联。
三.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制.