1、synchronized 关键字
-
保证线程安全
public class Demo {
...
class Ticket{
private int number;
public Ticket(int number) { this.number = number;}
public synchronized void sell(){
while (number>0){
System.out.println(Thread.currentThread().getName()+"卖出了第"+number--+"张票"
+"剩余"+number);
}}}
-
生产者消费者问题
public class Demo{ public static void main(String[] args) { Data data = new Data(1); // a线程打印奇数 new Thread(()->{ while (data.getA()<100) { data.printSingular(); } },"a").start(); // b线程打印偶数 new Thread(()->{ while (data.getA()<100) { data.printEvenNumbers(); } },"b").start(); }} class Data{ private int a; public Data(int a) { this.a = a; } public int getA() { return a; } synchronized void printSingular(){ try { while (a%2 == 0){ wait(); } } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"->"+a); a++; notifyAll(); } synchronized void printEvenNumbers(){ try { while (a%2 != 0){ wait(); } } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName()+"->"+a); a++; notifyAll(); }}
2、Lock接口
保证线程安全
class Ticket{
private int number;
private final ReentrantLock lock = new ReentrantLock();
public Ticket2(int number) {
this.number = number;
}
public void sell(){
lock.lock();
try {
while (number>0){
System.out.println(Thread.currentThread().getName()+"卖出了第"+number--+"张票"
+"剩余"+number);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
生产者消费者问题
//两条线程分别+1,-1
public class Demo{
public static void main(String[] args) {
Data3 data3 = new Data3();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
data3.one();
}
}, "a").start();
new Thread(() -> {
for (int i = 0; i < 10; i++) {
data3.two();
}
}, "b").start();
}}
class Data3 {
private int a = 0;
private final Lock lock = new ReentrantLock();
private final Condition condition = lock.newCondition();
void one() {
lock.lock();
try {
if (a != 0) {
condition.await();
}
a++;
System.out.println(Thread.currentThread().getName() + a);
condition.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}}
void two() {
lock.lock();
try {
if (a == 0) {
condition.await();
}
a--;
System.out.println(Thread.currentThread().getName() + a);
condition.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
Lock 线程通信
/*
* @return: a线程打印1,b线程打印a,c线程打印A*/
public class Demo4{
public static void main(String[] args) {
ThreadPrint threadPrint = new ThreadPrint();
new Thread(() -> {
for (int i = 0; i < 26; i++) {
threadPrint.a();
}
}, "线程1").start();
new Thread(() -> {
for (int i = 0; i < 26; i++) {
threadPrint.b();
}
}, "线程2").start();
new Thread(() -> {
for (int i = 0; i < 26; i++) {
threadPrint.c();
}
}, "线程3").start();}}
class ThreadPrint {
private int a = 1;
private int b = 97;
private int c = 65;
private int flag = 1;
private final Lock lock = new ReentrantLock();
private final Condition condition1 = lock.newCondition();
private final Condition condition2 = lock.newCondition();
private final Condition condition3 = lock.newCondition();
void a() {
lock.lock();
try {
while (flag != 1) {
condition1.await();}
System.out.println(Thread.currentThread().getName() + "->" + a);
a++;
flag = 2;
condition2.signal();
} catch (Exception e) {e.printStackTrace();} finally {lock.unlock();}}
void b() {
lock.lock();
try {
while (flag != 2) {
condition2.await();
}
System.out.println(Thread.currentThread().getName() + "->" + (char) b);
b++;
flag = 3;
condition3.signal();
} catch (Exception e) { e.printStackTrace();} finally {lock.unlock();}}
void c() {
lock.lock();
try {
while (flag != 3) {
condition3.await();
}
System.out.println(Thread.currentThread().getName() + "->" + (char) c);
c++;
flag = 1;
condition1.signal();
} catch (Exception e) {e.printStackTrace();
} finally
{lock.unlock();
}}}