本节课的疑问
来源:4-1 线程同步
qq_粽翎_0
2019-11-25 21:41:31
授课老师讲这个synchronized关键字时是不是太笼统了点。只是说加了它后其他线程就不能同时操作这个啥啥啥的,可以讲具体一点么? synchronized关键字在几个线程中具体到什么时候发生作用,作用会怎么样?
而且synchronized关键字加在成员方法和静态方法时又代表什么意思?这啥也没说啊。加在语句块时小括号里要写什么,是不是只有this还有没有其他的啥的? 求解
3回答
同学你好,
1、只是说加了它后其他线程就不能同时操作这个啥啥啥的,可以讲具体一点么?
synchronized关键字,最重要的作用就是保证同一时刻只有一个线程可以执行这个方法。也就是说同一个时间只能有一个线程得到执行,另一个线程必须等待当前线程执行完这个方法或者代码块以后再执行另一个线程的方法或者代码块。
例如:两个窗口在进行售票时,(两个窗口相当于两个线程),同一时间都要售买a车厢中20A座位的票,为了避免两个窗口都售卖这张票,就需要保证同一时刻只有一个窗口售卖成功,另一个窗口只能等待,之前的窗口卖完成以后在执行。
2、 synchronized关键字在几个线程中具体到什么时候发生作用,作用会怎么样?
synchronized关键字在进行一个线程执行的过程中,其它线程要参与执行时就会起作用。synchronized的作用就是防止同一时刻其他线程进入执行该方法,造成数据不同步等问题
3、synchronized关键字加在成员方法和静态方法时又代表什么意思?
synchronized关键字添加在静态方法时,表示锁定的是当前类的对象。
synchronized修饰成员方法时,对实例对象加锁,也就是bank对象。与synchronized修饰代码块,将this加锁的含义相同。
4、加在语句块时小括号里要写什么,是不是只有this还有没有其他的啥的?
是的,一般情况下都是编写this,锁定当前实例对象。保证当前类的对象,同一时刻只有一个线程可以执行这个方法。
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
好帮手慕小尤
2019-11-26
同学你好,1. 是的,synchronized关键字修饰普通成员方法和静态方法效果是一样。
2. synchronize修饰方法时,同步是调用这个方法时产生。
3. 括号中填写的对象,像我们在超市中存包时,当一个柜子中存入东西时,就会把这儿柜门锁上,给出小纸条作为钥匙,此时其他人去开这个柜门,就不能打开,而当我们买完东西,使用小纸条打开柜门,取出东西后,这个柜子的锁就释放了!那这时别人再来打开这个柜子,就可以打开了!
synchronized(任意自定义对象),这个括号里的对象,就相当于这个小纸条。
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!
好帮手慕小尤
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();
}
}
2. 当synchronized关键字修饰一个静态的方法时,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
3. 当synchronized关键字修饰一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。
4. this代表当前对象。是可以修改为任意自定义对象,对象监视器必须是同一个对象。只要对象监视是一个,就可以换成其他对象。
如果我的回答解决了你的疑惑,请采纳!祝学习愉快!