使用this作为线程对象锁

在不同线程中,相同对象中的 synchronized 会互斥。
语法结构:
synchronized(this){
//同步代码
}


public synchronized void accessVal(int newVal){
//同步代码
}

  1. /**
  2. * 定义程序员类
  3. */
  4. class Programer{
  5. private String name;
  6. public Programer(String name){
  7. this.name=name;
  8. }
  9. //打开电脑
  10. public void openConputer(){
  11. synchronized (this) {
  12. try {
  13. System.out.println(this.name + "接通电源");
  14. Thread.sleep(500);
  15. System.out.println(this.name + "按电脑开机键");
  16. Thread.sleep(500);
  17. System.out.println(this.name + "系统启动中");
  18. Thread.sleep(500);
  19. System.out.println(this.name + "系统启动成功");
  20. } catch (Exception e) {
  21. e.printStackTrace();
  22. }
  23. }
  24. }
  25. //编码
  26. synchronized public void coding(){
  27. try{
  28. System.out.println(this.name+"双击启动idea");
  29. Thread.sleep(500);
  30. System.out.println(this.name+"idea启动成功");
  31. Thread.sleep(500);
  32. System.out.println(this.name+"写代码");
  33. }catch (Exception e){
  34. e.printStackTrace();
  35. }
  36. }
  37. //上厕所
  38. public void wc(){
  39. synchronized("suibian") {
  40. try {
  41. System.out.println(this.name + "打开厕所门");
  42. Thread.sleep(500);
  43. System.out.println(this.name + "开始排泄");
  44. Thread.sleep(500);
  45. System.out.println(this.name + "冲水");
  46. Thread.sleep(500);
  47. System.out.println(this.name + "离开厕所");
  48. } catch (Exception e) {
  49. e.printStackTrace();
  50. }
  51. }
  52. }
  53. //程序员领取奖金
  54. public void programermoney(){
  55. synchronized (Programer.class) {
  56. try {
  57. System.out.println(this.name + "程序员被领导表扬");
  58. Thread.sleep(500);
  59. System.out.println(this.name + "拿钱");
  60. Thread.sleep(500);
  61. System.out.println(this.name + "感谢公司");
  62. Thread.sleep(500);
  63. System.out.println(this.name + "拿钱走人");
  64. } catch (Exception e) {
  65. e.printStackTrace();
  66. }
  67. }
  68. }
  69. }
  70. /**
  71. * 打开电脑线程
  72. */
  73. class Working1 extends Thread{
  74. private Programer p;
  75. public Working1(Programer p){
  76. this.p=p;
  77. }
  78. @Override
  79. public void run() {
  80. this.p.openConputer();
  81. }
  82. }
  83. /**
  84. * 代码线程
  85. */
  86. class Working2 extends Thread{
  87. private Programer p;
  88. public Working2(Programer p){
  89. this.p=p;
  90. }
  91. @Override
  92. public void run() {
  93. this.p.coding();
  94. }
  95. }
  96. /**
  97. *去厕所县城他
  98. */
  99. class Working3 extends Thread{
  100. private Programer p;
  101. public Working3(Programer p){
  102. this.p=p;
  103. }
  104. @Override
  105. public void run() {
  106. this.p.wc();
  107. }
  108. }
  109. /**
  110. * 程序员领取奖金
  111. */
  112. class ProgrammerMoney extends Thread{
  113. private Programer p;
  114. public ProgrammerMoney(Programer p){
  115. this.p = p;
  116. }
  117. @Override
  118. public void run() {
  119. this.p.programermoney();
  120. }
  121. }
  122. /**
  123. * 定义销售员类
  124. */
  125. class Saler{
  126. private String name;
  127. //构造方法
  128. public Saler(String name){
  129. this.name=name;
  130. }
  131. //销售员领取奖金
  132. public void salermoney(){
  133. synchronized (Saler.class) {
  134. try {
  135. System.out.println(this.name + "被领导表扬");
  136. Thread.sleep(500);
  137. System.out.println(this.name + "拿钱");
  138. Thread.sleep(500);
  139. System.out.println(this.name + "感谢公司");
  140. Thread.sleep(500);
  141. System.out.println(this.name + "拿钱走人");
  142. } catch (Exception e) {
  143. e.printStackTrace();
  144. }
  145. }
  146. }
  147. }
  148. /**
  149. * 销售员领取奖金线程
  150. */
  151. class SalerMoney extends Thread{
  152. private Saler s;
  153. public SalerMoney(Saler s){
  154. this.s=s;
  155. }
  156. @Override
  157. public void run() {
  158. this.s.salermoney();
  159. }
  160. }
  161. public class SynchroizedTest {
  162. public static void main(String[] args) {
  163. // Programer programer=new Programer("老耿");
  164. // new ProgrammerMoney(programer).start();
  165. // Programer programer1=new Programer("老李");
  166. // Programer programer2=new Programer("老王");
  167. // new Working3(programer1).start();
  168. // new Working3(programer2).start();
  169. // new Working1(programer).start();
  170. // new Working2(programer).start();
  171. Saler s1=new Saler("丽丽");
  172. Saler s2=new Saler("美美");
  173. new SalerMoney(s1).start();
  174. new SalerMoney(s2).start();
  175. }
  176. }

image.png

使用字符串作为线程对象锁

所有线程在执行 synchronized 时都会同步。
语法结构:
synchronized(“字符串”){
同步代码
}

代码见上“上厕所”

使用Class作为线程对象锁

在不同线程中,拥有相同 Class 对象中的 synchronized 会互斥。
语法结构:
synchronized(XX.class){
//同步代码
}

synchronized public static void accessVa()

代码同上“奖金”

使用自定义对象作为线程对象锁

在不同线程中,拥有相同自定义对象中的 synchronized 会互斥。
语法结构:
synchronized(自定义对象){
//同步代码
}

可以参考上节银行取款案例