黑马程序员技术交流社区
标题:
同步函数与同步代码块的用法与区别,请举例说明
[打印本页]
作者:
alax
时间:
2014-5-19 05:00
标题:
同步函数与同步代码块的用法与区别,请举例说明
同步函数与同步代码块的用法与区别
作者:
莫问纷飞
时间:
2014-5-19 13:14
同步代码块
格式:
synchronized(对象)
{
//需要被同步的代码;
}
同步:
好处:解决了多线程的安全问题。
弊端:降低了效率。
同步的前提:
1,至少有两个线程在同步中。
2,必须保证同步使用的是同一个锁。
同步函数。
public synchronized void test()//同步函数。
同步函数使用的锁,应该是this。
同步函数和同步代码块的区别?
同步函数使用的固定锁this。
同步代码块使用的锁是可以指定的。
作者:
路漫漫_求索
时间:
2014-5-19 17:48
用两个线程进行:卖票
class Ticket implements Runnable
{
//将票私有500张票
private int tick = 500;
//定义一个标记,用来调用两个线程
boolean flag = true;
//覆盖runnable中的run方法
public void run()
{
if(flag)
{
//打印车票
while(true)
{
//如果show方法被静态修饰,这里调用的对象是Ticket.class
synchronized(this)//因为run方法调用的show()方法,show方法调用的是this.所以这里是this
{
if(tick>0)
{
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread()+"同步售票"+tick--);
}
}
}
}
else
while(true)
show();
}
//对操作共享数据的代码块进行封装
public synchronized void show()
{
if(tick>0)
{
try{Thread.sleep(10);}catch(Exception e){}
//currentThread();获取线程名称
System.out.println(Thread.currentThread()+"..同步函数售票.."+tick--);
}
}
}
public class _线程同步 {
public static void main(String[]args)
{
Ticket t = new Ticket();
//创建线程
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
t1.start();
//当主函数执行到这儿时,让它停留10秒;原因是,main主函数线程会瞬间将两个线程开启执行,
//所以当线程执行到t.falg=false时,会直接执行到show方法
try{Thread.sleep(10);}catch(Exception e){}
t.flag = false;
t2.start();
}
}
通过例子说明:
同步函数使用的锁是this.
降低了线程安全问题,提高了效率
而同步代码块
格式:
synchronized(对象)
{
被同步的代码;
}
它解决了多线程的安全问题。但效率比较低。
作者:
格子、
时间:
2014-5-19 18:44
同步代码块的锁可以是任意对象。
同步函数的锁是固定的this锁,可以简化书写。不考虑锁的话,分别不大。
作者:
小呀嘛小二郎
时间:
2014-6-8 20:59
学到好多~~
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2