黑马程序员技术交流社区
标题:
多线程求解
[打印本页]
作者:
。。。。。。。
时间:
2013-11-7 09:28
标题:
多线程求解
用synchronized修饰的同步方法和synchronized同步代码块的区别是什么?
例如:
public synchronized void show(){
}
synchrinozed(类名.class){
}
作者:
青年黨衛軍
时间:
2013-11-7 10:34
本帖最后由 青年黨衛軍 于 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--);
}
}
}
复制代码
作者:
雪龙
时间:
2013-11-7 13:32
用synchronized修饰的同步方法和synchronized同步代码块的区别是什么?
第一,两者所用的锁不同 ,synchronized修饰的同步方法所用的锁是本类的对象锁 即this锁 ,而synchronized同步代码块的锁可以自定义
第二;控制范围,synchronized同步代码块可以自定义要同步的范围
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2