synchronized关键字可以定义同步方法或同步代码块,同步代码块的操作里只允许一个线程执行。
1.利用同步代码块进行处理
synchronized(同步对象) {
同步代码操作;
}
一般进行同步对象处理时可采用当前对象this进行同步。
利用同步代码块解决数据同步访问问题
package synchronization;
public class Syntest {
public static void main(String[] args) {
MyThread mt=new MyThread();
new Thread(mt,"售票A").start();
new Thread(mt,"售票B").start();
new Thread(mt,"售票C").start();
}
}
class MyThread implements Runnable{
private int ticket=10;
@Override
public void run() {
synchronized(this) {//每一次只允许一个进程进行访问
while(true) {
if(this.ticket>0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"卖票:"+this.ticket--);
}else {
System.out.println("**********售空**********");
break;
}
}
}//
}
}
加入同步处理后,程序的整体效率下降。同步可能会造成性能的降低。
2.利用同步同步方法解决:只需要在方法定义上使用synchronized关键字
package synchronization;
public class Syntest {
public static void main(String[] args) {
MyThread mt=new MyThread();
new Thread(mt,"售票A").start();
new Thread(mt,"售票B").start();
new Thread(mt,"售票C").start();
}
}
class MyThread implements Runnable{
private int ticket=10;
public synchronized boolean sale() {
if(this.ticket>0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"卖票:"+this.ticket--);
return true;
}else {
System.out.println("**********售空**********");
return false;
}
}
@Override
public void run() {
while(this.sale());
}
}
死锁
死锁:多个线程相互等待。
若干线程访问同一资源是要同步处理,而过多的同步会造成死锁。