同步的两种实现方法

synchronized关键字有两种方式实现

  • 同步代码块 : 利用synchronized包装的代码块,但是需要指定同步对象,一般设置为this
  • 同步方法 : 利用synchronized定义的方法
  1. public class Test extends Object {
  2. public static void main(String[] args) throws Exception {
  3. Runnable myThread = new MyThread();
  4. Thread thread0 = new Thread(myThread);
  5. Thread thread1 = new Thread(myThread);
  6. Thread thread2 = new Thread(myThread);
  7. Thread thread3 = new Thread(myThread);
  8. Thread thread4 = new Thread(myThread);
  9. thread0.start();
  10. thread1.start();
  11. thread2.start();
  12. thread3.start();
  13. thread4.start();
  14. }
  15. }
  16. //同步代码块
  17. class MyThread implements Runnable {
  18. private int ticket = 5;
  19. @Override
  20. public void run() {
  21. for (int i = 0; i < 50; i++) {
  22. synchronized(this){
  23. if (this.ticket > 0) {
  24. try {
  25. Thread.sleep(500);
  26. } catch (InterruptedException e) {
  27. e.printStackTrace();
  28. }
  29. this.ticket--;
  30. System.out.println(Thread.currentThread().getName() + "余票:" + this.ticket);
  31. }
  32. }
  33. }
  34. }
  35. }
  36. //同步方法
  37. class MyThread implements Runnable {
  38. private int ticket = 5;
  39. @Override
  40. public void run() {
  41. for (int i = 0; i < 50; i++) {
  42. this.sale();
  43. }
  44. }
  45. public synchronized void sale(){
  46. if (this.ticket > 0) {
  47. try {
  48. Thread.sleep(500);
  49. } catch (InterruptedException e) {
  50. e.printStackTrace();
  51. }
  52. this.ticket--;
  53. System.out.println(Thread.currentThread().getName() + "余票:" + this.ticket);
  54. }
  55. }
  56. }

锁的类型

根据sunchronized关键字修饰的位置不同,锁也不同。除了代码块和方法上的差异,还有静态非静态的差异。
本质上都是对象锁;差异在锁的对象是不一样的。
非静态锁的是调用该方法的实例对象静态锁的是 类.Class对象

同步操作 : synchronized 基础 - 图1