同步解决线程安全问题
同步代码块 synchronized(对象) { 需要被同步的代码; 这里的锁对象可以是任意对象。
public class SellTicket implements Runnable {
private int tickets =
100;
private Object obj =
new Object();
@Override
public void run() {
while (
true) {
synchronized (obj) {
if (tickets >
0) {
try {
Thread.sleep(
100);
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+
"正在出售第" + (tickets--) +
"张票 ");
}
}
}
}
}
public class SellTicketDemo {
public static void main(String[] args) {
SellTicket st =
new SellTicket();
Thread t1 =
new Thread(st,
"窗口1");
Thread t2 =
new Thread(st,
"窗口2");
Thread t3 =
new Thread(st,
"窗口3");
t1.start();
t2.start();
t3.start();
}
}
静态同步方法 把同步加在方法上。 这里的锁对象是当前类的字节码文件对象
public class SellTicket implements Runnable {
private static int tickets =
100;
private Object obj =
new Object();
private Demo d =
new Demo();
private int x =
0;
@Override
public void run() {
while (
true) {
if(x%
2==
0){
synchronized (SellTicket.class) {
if (tickets >
0) {
try {
Thread.sleep(
100);
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+
"正在出售第" + (tickets--) +
"张票 ");
}
}
}
else {
sellTicket();
}
x++;
}
}
private static synchronized void sellTicket() {
if (tickets >
0) {
try {
Thread.sleep(
100);
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+
"正在出售第" + (tickets--) +
"张票 ");
}
}
}
public class SellTicketDemo {
public static void main(String[] args) {
SellTicket st =
new SellTicket();
Thread t1 =
new Thread(st,
"窗口1");
Thread t2 =
new Thread(st,
"窗口2");
Thread t3 =
new Thread(st,
"窗口3");
t1.start();
t2.start();
t3.start();
}
}
同步方法 把同步加在方法上。 这里的锁对象是this
public class SellTicket implements Runnable {
private static int tickets =
100;
private Object obj =
new Object();
private Demo d =
new Demo();
private int x =
0;
@Override
public void run() {
while (
true) {
if(x%
2==
0){
synchronized (SellTicket.class) {
if (tickets >
0) {
try {
Thread.sleep(
100);
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+
"正在出售第" + (tickets--) +
"张票 ");
}
}
}
else {
sellTicket();
}
x++;
}
}
private void sellTicket() {
synchronized (d) {
if (tickets >
0) {
try {
Thread.sleep(
100);
}
catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()
+
"正在出售第" + (tickets--) +
"张票 ");
}
}
}
}
public class SellTicketDemo {
public static void main(String[] args) {
SellTicket st =
new SellTicket();
Thread t1 =
new Thread(st,
"窗口1");
Thread t2 =
new Thread(st,
"窗口2");
Thread t3 =
new Thread(st,
"窗口3");
t1.start();
t2.start();
t3.start();
}
}