当多线程访问共享数据的时候,会出现线程安全问题,要解决线程安全问题,就是将操作共享数据的地方加同步锁。保证对操作该共享数据的时候是同步的,就可以解决线程安全问题了。
但是因为需要判断锁,需要消耗资源,导致程序变慢。
public class ThreadTest {
public static void main(String[] args) {
Ticket t1 = new Ticket();
new Thread(t1).start();
new Thread(t1).start();
new Thread(t1).start();
new Thread(t1).start();
}
}
class Ticket implements Runnable {
private int tick = 100;
Object obj = new Object();
@Override
public void run() {
while(true) {
synchronized (obj) {
if(tick > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread() + "sale : " + tick --);
} else {
break;
}
}
}
}
}
同步代码块的锁是任意一个对象。
但是在下放的同步方法中,锁是this。
同步函数如果是静态方法的话,锁是Class,即该静态方法所在类的字节码对象。
public class BankDemo {
public static void main(String[] args) {
Customer c = new Customer();
new Thread(c).start();
new Thread(c).start();
new Thread(c).start();
new Thread(c).start();
}
}
class Bank {
private int sum;
Object obj = new Object();
/**
* 同步方法
* @param n
*/
public synchronized void add(int n) {
// 同步代码块
/*synchronized (obj) {
sum += n;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(sum);
}*/
sum += n;
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(sum);
}
}
class Customer implements Runnable {
private Bank b = new Bank();
@Override
public void run() {
for (int i = 0; i < 5; i++) {
b.add(100);
}
}
}