本节课的疑问

来源:4-1 线程同步

qq_粽翎_0

2019-11-25 21:41:31

授课老师讲这个synchronized关键字时是不是太笼统了点。只是说加了它后其他线程就不能同时操作这个啥啥啥的,可以讲具体一点么? synchronized关键字在几个线程中具体到什么时候发生作用,作用会怎么样?

而且synchronized关键字加在成员方法和静态方法时又代表什么意思?这啥也没说啊。加在语句块时小括号里要写什么,是不是只有this还有没有其他的啥的? 求解

写回答

3回答

好帮手慕酷酷

2019-11-26

同学你好,

1、只是说加了它后其他线程就不能同时操作这个啥啥啥的,可以讲具体一点么?

synchronized关键字,最重要的作用就是保证同一时刻只有一个线程可以执行这个方法。也就是说同一个时间只能有一个线程得到执行,另一个线程必须等待当前线程执行完这个方法或者代码块以后再执行另一个线程的方法或者代码块。

例如:两个窗口在进行售票时,(两个窗口相当于两个线程),同一时间都要售买a车厢中20A座位的票,为了避免两个窗口都售卖这张票,就需要保证同一时刻只有一个窗口售卖成功,另一个窗口只能等待,之前的窗口卖完成以后在执行。

2、 synchronized关键字在几个线程中具体到什么时候发生作用,作用会怎么样?

synchronized关键字在进行一个线程执行的过程中,其它线程要参与执行时就会起作用。synchronized的作用就是防止同一时刻其他线程进入执行该方法,造成数据不同步等问题

3、synchronized关键字加在成员方法和静态方法时又代表什么意思?

synchronized关键字添加在静态方法时,表示锁定的是当前类的对象。

synchronized修饰成员方法时,对实例对象加锁,也就是bank对象。与synchronized修饰代码块,将this加锁的含义相同。

4、加在语句块时小括号里要写什么,是不是只有this还有没有其他的啥的?

是的,一般情况下都是编写this,锁定当前实例对象。保证当前类的对象,同一时刻只有一个线程可以执行这个方法。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

0
hq_粽翎_0
h 啊舒服多了,加鸡腿! 感谢解答
h019-11-26
共1条回复

好帮手慕小尤

2019-11-26

同学你好,1. 是的,synchronized关键字修饰普通成员方法和静态方法效果是一样。

2. synchronize修饰方法时,同步是调用这个方法时产生。

3. 括号中填写的对象,像我们在超市中存包时,当一个柜子中存入东西时,就会把这儿柜门锁上,给出小纸条作为钥匙,此时其他人去开这个柜门,就不能打开,而当我们买完东西,使用小纸条打开柜门,取出东西后,这个柜子的锁就释放了!那这时别人再来打开这个柜子,就可以打开了!

synchronized(任意自定义对象),这个括号里的对象,就相当于这个小纸条。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

0
hq_粽翎_0
h 哎呀我好烦啊,我理解好了的你就给我重复一遍,不理解的你说了等于没说我还是不理解,替我告诉慕酷酷说我想他了,让他来帮我解答一下可以么,谢谢~
h019-11-26
共1条回复

好帮手慕小尤

2019-11-26

同学你好,1. 如果一个方法或一段代码在执行过程中不希望被打断,就可以加上synchronized关键字,在执行过程中加上锁。如果不加,就会出现这个方法执行一半,就会被其他线程打断的情况!如果加,在执行过程中就不会被其他线程打断。如下所示:

// Dog类 
public class Dog implements Runnable {

   @Override 
   public void run() {
       // TODO Auto-generated method stub
       for (int i = 1; i<4; i++) {
           System.out.println(Thread.currentThread().getName() +" A dog");
       }
   }
    
}
// Cat 类
 public class Cat implements Runnable{
	 
    @Override
    public void run() {
        // TODO Auto-generated method stub
        this.info();
             
        }   
         
    public synchronized void info() {
        for (int i = 1; i<4; i++) {
            System.out.print(i + " :");
            try {
                Thread.sleep(500);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + " A cat");
        }
        System.out.println("aaaaaaa");
    }
}

// 测试类
public class Test {
	 public static void main(String[] args) {
	        // TODO Auto-generated method stub
	        Cat c = new Cat();
	        Dog d = new Dog();
	         
	        //Miao~ 和 Wang~~ 为自定义进程名
	        Thread t1 = new Thread(c, "Miao~");
	        Thread t2 = new Thread(d, "Wang~~");
	        t1.start();
	        t2.start();
	          
	    }
}

http://img.mukewang.com/climg/5ddc96de093ff47f02770229.jpg

2. 当synchronized关键字修饰一个静态的方法时,其作用的范围是整个静态方法,作用的对象是这个类的所有对象; 
3. 当synchronized关键字修饰一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。

4. this代表当前对象。是可以修改为任意自定义对象,对象监视器必须是同一个对象。只要对象监视是一个,就可以换成其他对象。

如果我的回答解决了你的疑惑,请采纳!祝学习愉快!

0
hq_粽翎_0
h 你说的我一句都看不懂,可以讲地更通俗细致点么?synchronized关键字修饰普通成员方法和静态方法是不是效果一样?它的同步功能是调用这个方法的时候产生效果还是什么时候?代码块的形式使用synchronized关键字时括号后面写的是啥?限制的是什么?写的是类名还是对象名?为什么写在方法上面的时候不用指定限制的是啥也可以起到同步的作用?,别说什么类对象啥的,简单粗暴直白通俗点可以不?新手,希望可以说通俗点,举一些例子,能让人更好理解的,你上面回复的我是真看不懂,别说得太笼统啊,
h019-11-26
共1条回复

0 学习 · 11489 问题

查看课程

相似问题