为什么要在线程里面使用同步 - synchronized
首先看个列子:
假设系统里面有5张票,有个卖票的系统,执行完,打印的结果是这样的:
public class RunDemo05 implements Runnable {
private int count = 5;
public void run()
{
for(int i=0;i<10;i++)
{
sale();
}
}
public void sale(){
if (count>0)
{
try{
Thread.sleep(1000);
}
catch(Exception e){
e.printStackTrace();
}
System.out.println(count--);
}
}
public static void main(String[] args) {
RunDemo05 r = new RunDemo05();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
Thread t3 = new Thread(r);
t1.start();
t2.start();
t3.start();
}
}
结果:
5
3
4
2
1
2
出现这样的原因: 在同一时刻有多个线程访问count数据,所以导致这种结果。
synchronized可以解决这个问题,它是的系统里面的某一时刻只有一个线程在运行。
synchronized的使用方法: 1. 使用synchronized方法 2. 使用synchronized程序块
package com.pwc.thread;
public class RunDemo05 implements Runnable {
private int count = 5;
public void run()
{
for(int i=0;i<10;i++)
{
sale();
}
}
public synchronized void sale(){
if (count>0)
{
try{
Thread.sleep(1000);
}
catch(Exception e){
e.printStackTrace();
}
System.out.println(count--);
}
}
public static void main(String[] args) {
RunDemo05 r = new RunDemo05();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
Thread t3 = new Thread(r);
t1.start();
t2.start();
t3.start();
}
}
结果:
5
4
3
2
1
使用synchronized程序块:
package com.pwc.thread;
public class RunDemo05 implements Runnable {
private int count = 5;
public void run()
{
for(int i=0;i<10;i++)
{
sale();
}
}
public void sale(){
synchronized(this){
if (count>0)
{
try{
Thread.sleep(1000);
}
catch(Exception e){
e.printStackTrace();
}
System.out.println(count--);
}
}
}
public static void main(String[] args) {
RunDemo05 r = new RunDemo05();
Thread t1 = new Thread(r);
Thread t2 = new Thread(r);
Thread t3 = new Thread(r);
t1.start();
t2.start();
t3.start();
}
}
结果:
5
4
3
2
1
来源:https://www.cnblogs.com/tman/p/3977305.html