A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

什么情况用同步代码快,什么时候用同步函数?看过视频还是未能理解,谁能解释下 。。。?

7 个回复

倒序浏览
当有许多的线程执行同一运行代码时,用同步函数会影响程序的执行效率
回复 使用道具 举报
就一句话共享了数据,那就用块,要是一个函数都共享了数据,那就直接函数喽
回复 使用道具 举报
说白了就是在你写的多线程共享数据块中加一个锁,  使得系统中在使用这块数据中,只能有一个线程来执行。
回复 使用道具 举报
什么时候用同步代码块,什么时候用同步函数,这样看具体情况。有时候多线程可能会执行同一数据,也就是同一代码时,用同步代码块会效率高一点。
回复 使用道具 举报
tianleboy 发表于 2014-7-13 11:40
什么时候用同步代码块,什么时候用同步函数,这样看具体情况。有时候多线程可能会执行同一数据,也就是同一 ...

能举个例子么。。。。
回复 使用道具 举报
具体说明下就好了。。。
回复 使用道具 举报
风决 发表于 2014-7-14 17:15
能举个例子么。。。。

就拿毕老师同步买票那个例子来说:  如果你用同步函数的话:
lass Ticket implements Runnable{
private int num=100;
public void run(){
show();
}
public synchronized void show() {
while (true) {
if (num == 0) return;
try {Thread.sleep(30);} catch (InterruptedException e) {}
System.out.println("...." + Thread.currentThread().getName()+ "....." + num--);
}
}
}

public class TicketSell {
public static void main(String[] args) {
Ticket t=new Ticket();

Thread t1=new Thread(t);
Thread t2=new Thread(t);
Thread t3=new Thread(t);
Thread t4=new Thread(t);

t1.start();
t2.start();
t3.start();
t4.start();
}
}
这样子看起来是对的,但你编译后会知道这里只有一个线程在使用,另一个线程时抢不到的。这是因为一个线程进去同步函数,把循环做完才算同步。所以要求你将可能并发出syn{},写起来比同步函数稍微难写点.


class Ticket1 implements Runnable{
private int num = 100;
Object obj = new Object();
public void run(){
while(true){
synchronized(obj){
if(num==0) return;
try{Thread.sleep(30);}catch (InterruptedException e){}
System.out.println(Thread.currentThread().getName()+".....sale...."+num--);
            }
     }
  }
}
//主函数省略了
这样写就会清晰的明白那里加同步。

还有就是要注意的是:
1.同步代码块,使用的锁可以是任意对象,但是操作共享资源时,锁必须唯一!

2.同步函数,使用的锁是this!

而且同步代码块又是可以用双重否定来解决效率低的问题
比如懒汉式:
class Single{
        private static Single s = null;
        private Single(){}
       
        public static Single getInstanc(){
                if(s==null){
                        synchronized (Single.class) {
                                if(s==null)
                                        s = new Single();
                        }
                }
                return s;
        }
       
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马