1.synchronized上锁的资源只有两类:一个是对象,一个是类。 即synchronized底层其实就是给对象或者类上锁
synchronized 加锁是加给某个对象的( 若是static方法则是加给某个类的 )
所以线程在执行带 synchronized 的方法前,必须先获得 synchronized 加的锁。
下面代码是两个线程都对同一个变量i进行加操作,两个线程都是要加100万 次,那么按理说,运行结果应该是200万才对,但是程序运行结果往往是低于200万。而且add()方法还加了synchronized关键字,保证线程安全,但是为什么结果还是少于200万呢?
没有使用同一个对象
正确方式是:Test2 test2 = new Test2();
2. synchronized实现原理?
3. synchronized如何保证原子性,可见性,顺序性?(可重入性)?
4. 可重入锁的实现原理?
5. 尝试利用可重入锁或同步锁实现两个线程交替打印abcd?
synchronized的方法
wait()、notify()和notifyAll()这三个方法都依赖于Java对象的互斥锁。调用这些方法时,当前线程必须持有该对象的互斥锁,所以通常它们三都与synchronized关键字一起使用
当线程调用对象的wait()方法时,它会释放该对象的互斥锁。这允许其他线程能够进入同步代码块或方法,并获得锁以执行其操作。(与此相反sleep方法不会释放互斥锁)
wait()方法通常与notify()或notifyAll()方法一起使用,以在多个线程之间实现协作。一个线程可以调用wait()来等待另一个线程
而另一个线程可以在条件成立后
调用notify()或notifyAll()来唤醒使用wait()而休息的线程。
使用方法
(任务1)synchronized ( Object o) {o.wait(); ……}
(任务2)synchronized ( Object o) {……o.notify(); }
6. synchronized的锁升级?