本帖最后由 青年黨衛軍 于 2013-11-7 10:59 编辑
1.synchronized修饰的同步方法
它是依靠对象锁锁定,当你在程序中初始化一个对象时,自动有一个对象锁。
synchronized {普通方法}依靠对象锁工作,多线程访问ynchronized方法,
一旦某个进程抢得锁之后,其他的进程只有排队对待。比如以下代码中,方式一和方式二是等效的。- 方式一:public synchronized void method{}
- 方式二:
- void method
- {
- {
- synchronized(this)
- }
- }
复制代码 2.synchronized同步代码块相比较而言,synchronized {修饰代码块}的作用不仅于此,synchronized void method{}整个函数加上synchronized块,效率并不好。在函数内部,可能我们需要同步的只是小部分共享数据,其他数据,可以自由访问,这时候我们可以用 synchronized(表达式){//语句}更加精确的控制。
synchronized修饰的同步方法和synchronized同步代码块的区别在毕老师的基础视频中多线程部分的卖票例子也有体现:
public void run()方法中两个while循环中,第一个while循环中使用了synchronized同步代码块,但不会影响第二个while循环的使用,而public static synchronized void show()方法则使用了synchronized修饰的同步方法,因为该方法体中所有的语句都需要同步。- class TicketThread implements Runnable
- {
- private static int ticket = 100;
- //Object obj = new Object();
- boolean flag = true;
- public void run()
- {
- if(flag)
- {
- while(true)
- {
- synchronized(TicketThread.class)
- {
- if(ticket > 0)
- {
-
- try {Thread.sleep(10);} catch (Exception e){e.printStackTrace();}
- System.out.println(Thread.currentThread().getName()+" selling... "+ticket--);
- }
- }
- }
- }
- else
- {
- while(true)
- {
- this.show();
- }
-
- }
- }
-
- public static synchronized void show()//this
- {
- if(ticket > 0)
- {
-
- try {Thread.sleep(10);} catch (Exception e){e.printStackTrace();}
- System.out.println(Thread.currentThread().getName()+" showing... "+ticket--);
- }
- }
- }
复制代码 |