package xiancheng;
import xiancheng.Table.Person;
public class Threadsafe {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Table table=new Table();
Person p1=table.new Person();
Person p2=table.new Person();
p1.start();
p2.start();
/*
* Thread-0,20
Thread-1,19
Thread-0,18
Thread-1,17
Thread-0,16
Thread-1,15注意这里出现的线程安全问题
* */
}
}
class Table{
int beans=60;
Object monitor=new Object(); //还有这里也是一种,而且一定要写在方法的外面,不如调用一次会有一个锁,那就不是一个锁,也没有意义了
public /*synchronized 这里直接修饰的是一种 */ int getBean(){
//synchronized (this) { //这里注释的是一种
synchronized (monitor) {
if(beans==0)throw new RuntimeException("没了");
Thread.yield();
return beans--;
//}
}
}
class Person extends Thread{
@Override
public void run() {
// TODO 自动生成的方法存根
while(true){
int bean=getBean();
System.out.println(getName()+","+bean);
Thread.yield();
}}}}
import xiancheng.Table.Person;
public class Threadsafe {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Table table=new Table();
Person p1=table.new Person();
Person p2=table.new Person();
p1.start();
p2.start();
/*
* Thread-0,20
Thread-1,19
Thread-0,18
Thread-1,17
Thread-0,16
Thread-1,15注意这里出现的线程安全问题
* */
}
}
class Table{
int beans=60;
Object monitor=new Object(); //还有这里也是一种,而且一定要写在方法的外面,不如调用一次会有一个锁,那就不是一个锁,也没有意义了
public /*synchronized 这里直接修饰的是一种 */ int getBean(){
//synchronized (this) { //这里注释的是一种
synchronized (monitor) {
if(beans==0)throw new RuntimeException("没了");
Thread.yield();
return beans--;
//}
}
}
class Person extends Thread{
@Override
public void run() {
// TODO 自动生成的方法存根
while(true){
int bean=getBean();
System.out.println(getName()+","+bean);
Thread.yield();
}}}}